C语言6 运算符和表达式

Asura 2017年12月28日 100次浏览

运算符与表达式

什么是运算符?什么是表达式?

int x,y;
x+y x-y  x>y x==y x=y

表达式的结果

(x+y)*(x-y)
char => short => int => float => double
/*如果x和 y类型 不同,最终结果按照上面结果类型转换*/

表达式不论怎么复杂。最终只有一个结果

不同类型运算结果类型证明的例子:

void main()
{
    char x =1;
    short y = 2;
    int z = x + y;
    return
}

对应汇编片段:

mov byte ptr [ebp-4],1
mov word ptr [ebp-8],offset main+20h(00401030)
movsx eax,byte ptr [ebp-4]
movsx ecx,word ptr [ebp-8]
add  eax,ecx
mov dword ptr [ebp-0Ch],eax

运算符

算术运算符

+   -   *   /   %   ++  --
加  减  乘  除  取余  自加 自减
int i = 1;

i 和 i

/*i++和++i的区别
i++ 先运算再自加
++i 先自加再运算*/
++i;
mov eax,dword ptr [ebp-4]
add eax,1
mov dword ptr [ebp-4],eax
i++;
mov eax,dword ptr [ebp-4]
add eax,1
mov dword ptr [ebp-4],eax
这俩其实是一样的!!但是为啥有这个 前后的区别呢?
往下看~~~
printf("%d \n",i++);
mov eax,dword ptr [ebp-4]
mov dword ptr [ebp-8],eax
mov ecx,dword ptr[ebp-8]
push ecx
push offset string "%d \n" (0042201c)
mov edx,dword ptr [ebp-4]
add edx,1
mov dword ptr [ebp-4],edx
call printf(00401070)
所以i++
就是先压入 i的值之后,才会 +1
也就是先让函数使用i运算后,才会+1
反之亦然 ++i 则是先+1 再运算

关系运算符

<      >=  ==  !=
关系运算符的值只能是0或1
关系运算符的值为真时,结果值都为1
关系运算符的值为假时,结果值都为0

逻辑运算符

!   %%  ||
x>y && xy || x   ~   |   ^    &
左移 右移  非   或  异或  与

赋值运算符:

= 拓展赋值

条件运算符

?: