[置顶] day35.运算符与表达式
2018-03-02 20:21
155 查看
第35节:运算符与表达式
1、什么是运算符,什么是表达式?
例子:
int x,y
x+y x-y x==y x=y
表达式=运算符+变量
2、表达式使用的数据类型分为如下:
char -> short -> int -> float -> double
char和short加起来是int,以上数据类型如使用了两个不同数据类型表达式后是由类型最宽来决定输出是什么类型。
例子:
#include<stdio.h>
void main(){
short x = 1.2F;
int y = 4;
short z = x + y;
printf("%d\n",z);
}
注意:编译器会出现警告,但可以执行。输出的结果是5。(就是说short z 的值输出还是输出int,也就论证了:类型最宽来决定输出)
3、算术运算符
+ - * / % ++ --
例子:++在后 先运算 在自加
#include<stdio.h>
void main(){
int x = 1;
x++;
printf("%d\n",x);
return;
}
例子:++在前 先自加 后运算
#include<stdio.h>
void main(){
int x = 1;
++x;
printf("%d\n",x);
return;
}
反汇编结果:
4: int x = 1;
00401028 mov dword ptr [ebp-4],1
5: x++;
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
4、关系运算符
<、<=、>、>=、==、!=
关系运算符的值只能是0或1。
关系运算符的值为真时,结果值都为1
关系运算符的值为假时,结果值都为0
5、逻辑运算符 &&、||
int r=x>y & x<z;
这种结果是不支持的,如果按照以上的运算的话,在加一个& x>y那么它会继续执行&x>y这个判断。(这种写法会让效率降低),要写成如下:
int r=x>y && x<z;
int x>y || x<z
这种情况只要有一个是真,结果就是真。
6、位运算符
<< >> ~ | ^ &
例子:
x = 1
y = 2
0000 0001
& 0000 0010
----------------
0000 0000
与运算都为1的时候,则为1
0000 0001
| 0000 0010
---------------
0000 0011
或运算 只要有一个为1,则为1
0000 0001
^ 0000 0010
--------------
0000 0011
异或的结果是(不一样的结果为1)
0000 0010
~
---------------
1111 1101
“~” 取反 结果FD = -3
使用位运算的C语言代码
#include<stdio.h>
int x = 1;
int y = 2;
unsigned z= 2;
void main(){
printf("%d\n",x&y);
printf("%d\n",x|y);
printf("%d\n",x^y);
printf("%d\n",~y);
printf("%d\n",y<<1);
printf("%d\n",z<<1);
printf("%d\n",y>>1);
printf("%d\n",z>>1);
}
汇编中:
左移 shl ecx,1
右移 sar eax,1 (算术右移前面补的是符号位)
shr ecx,1 (无符号数逻辑右移不管前面是什么,全部补零)
如果C语言代码中的表达式是:
int y = -2;
unsigned z = -2;
这样的结果是不同的。
7、赋值运算符
=拓展赋值
例子:
int z+=1; //拓展赋值
8、条件运算符 ?:
C语言例子:
#include<stdio.h>
void main(){
int x = 10;
int y = 20;
int z = x>y?2:3; //如果为真返回2,否则返回3
}
反汇编如下:
4: int x = 10;
00401028 mov dword ptr [ebp-4],0Ah
5: int y = 20;
0040102F mov dword ptr [ebp-8],14h
6: int z = x>y?2:3;
00401036 mov eax,dword ptr [ebp-4]
00401039 xor ecx,ecx
0040103B cmp eax,dword ptr [ebp-8]
0040103E setle cl
00401041 add ecx,2
00401044 mov dword ptr [ebp-0Ch],ecx
1、什么是运算符,什么是表达式?
例子:
int x,y
x+y x-y x==y x=y
表达式=运算符+变量
2、表达式使用的数据类型分为如下:
char -> short -> int -> float -> double
char和short加起来是int,以上数据类型如使用了两个不同数据类型表达式后是由类型最宽来决定输出是什么类型。
例子:
#include<stdio.h>
void main(){
short x = 1.2F;
int y = 4;
short z = x + y;
printf("%d\n",z);
}
注意:编译器会出现警告,但可以执行。输出的结果是5。(就是说short z 的值输出还是输出int,也就论证了:类型最宽来决定输出)
3、算术运算符
+ - * / % ++ --
例子:++在后 先运算 在自加
#include<stdio.h>
void main(){
int x = 1;
x++;
printf("%d\n",x);
return;
}
例子:++在前 先自加 后运算
#include<stdio.h>
void main(){
int x = 1;
++x;
printf("%d\n",x);
return;
}
反汇编结果:
4: int x = 1;
00401028 mov dword ptr [ebp-4],1
5: x++;
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
4、关系运算符
<、<=、>、>=、==、!=
关系运算符的值只能是0或1。
关系运算符的值为真时,结果值都为1
关系运算符的值为假时,结果值都为0
5、逻辑运算符 &&、||
int r=x>y & x<z;
这种结果是不支持的,如果按照以上的运算的话,在加一个& x>y那么它会继续执行&x>y这个判断。(这种写法会让效率降低),要写成如下:
int r=x>y && x<z;
int x>y || x<z
这种情况只要有一个是真,结果就是真。
6、位运算符
<< >> ~ | ^ &
例子:
x = 1
y = 2
0000 0001
& 0000 0010
----------------
0000 0000
与运算都为1的时候,则为1
0000 0001
| 0000 0010
---------------
0000 0011
或运算 只要有一个为1,则为1
0000 0001
^ 0000 0010
--------------
0000 0011
异或的结果是(不一样的结果为1)
0000 0010
~
---------------
1111 1101
“~” 取反 结果FD = -3
使用位运算的C语言代码
#include<stdio.h>
int x = 1;
int y = 2;
unsigned z= 2;
void main(){
printf("%d\n",x&y);
printf("%d\n",x|y);
printf("%d\n",x^y);
printf("%d\n",~y);
printf("%d\n",y<<1);
printf("%d\n",z<<1);
printf("%d\n",y>>1);
printf("%d\n",z>>1);
}
汇编中:
左移 shl ecx,1
右移 sar eax,1 (算术右移前面补的是符号位)
shr ecx,1 (无符号数逻辑右移不管前面是什么,全部补零)
如果C语言代码中的表达式是:
int y = -2;
unsigned z = -2;
这样的结果是不同的。
7、赋值运算符
=拓展赋值
例子:
int z+=1; //拓展赋值
8、条件运算符 ?:
C语言例子:
#include<stdio.h>
void main(){
int x = 10;
int y = 20;
int z = x>y?2:3; //如果为真返回2,否则返回3
}
反汇编如下:
4: int x = 10;
00401028 mov dword ptr [ebp-4],0Ah
5: int y = 20;
0040102F mov dword ptr [ebp-8],14h
6: int z = x>y?2:3;
00401036 mov eax,dword ptr [ebp-4]
00401039 xor ecx,ecx
0040103B cmp eax,dword ptr [ebp-8]
0040103E setle cl
00401041 add ecx,2
00401044 mov dword ptr [ebp-0Ch],ecx
相关文章推荐
- 二、php的运算符和表达式
- [置顶] JS--函数表达式
- ORACLE存储过程笔记----运算符和表达式
- C程序设计语言- 类型、运算符与表达式-2.1----变量名、数据类型及长度、常量、声明、算数运算符、关系运算符与逻辑预算符
- Linux之运算符与表达式
- 第五章 运算符与表达式
- JavaScript权威指南_21_第4章_表达式和运算符_4.7-运算符概述
- XPath谓词(筛选表达式)及轴的概念 运算符及特殊字符 常用表达式实例
- Java学习笔记---运算符与表达式
- 黑马程序员---表达式和运算符
- 前端PHP入门-006-表达式和运算符
- 运算符和表达式
- 第三章:数据类型、运算符与表达式-笔记总结
- (6)JavaScript学习笔记 - 表达式和运算符
- C语言基础教程读书笔记3(第三章运算符和表达式)
- 表达式和运算符
- (C语言教程)第二章: 数据类型、运算符、表达式
- ASP.NET--表达式、运算符与分支结构(实战案例汇总2)
- C primer plus 第5章 运算符、表达式和语句 5.1循环简价
- C Primer Plus 第5章 运算符、表达式和语句 编程练习