您的位置:首页 > 其它

[置顶] 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: