[TOC] > 不同类型运算后,以最宽的为准。 ## 一、算数运算符 ```c + - * / % ++ -- 加 减 乘 除 取余 自加 自减 ``` ### 1.1自加自减的区别 ```c #include int main() { int x = 1; 007C1838 mov dword ptr [edp - 4],1 int y = 1; 007C1838 mov dword ptr [edp - 8],1 ++x; //++ 后 再运算 后自加 x++; //++ 前 再自加 再运算 007C183F mov eax,dword ptr [edp - 4] 007C1842 add eax,1 007C1845 mov dword ptr [ebp - 4],eax printf("%d \n", x++); // ++ 后 再运算 后自加 ebp - 4 = x // 先传参数进去,然后再自家 00461826 mov eax,dword ptr [ebp - 4] //取出x 00461829 mov dword ptr [ebp-0DCh],eax //先吧原始的x值传进去 0046182F mov ecx,dword ptr [ebp - 4] //取出x 00461832 add ecx,1 //自加 00461835 mov dword ptr [ebp - 4],ecx //自加结果重新赋值给x 00461838 mov edx,dword ptr [ebp-0DCh] //取出原始x值 0046183E push edx //入参,原始x 0046183F push offset string "%d \n" (0467B30h) 00461844 call _printf (0461046h) 00461849 add esp,8 printf("%d \n", ++y); // ++ 前 再自加 再运算 ebp - 8 = y // 先自加,然后再传参数 0046184C mov eax,dword ptr [ebp - 8] //取y 0046184F add eax,1 //自加 00461852 mov dword ptr [ebp - 8],eax //自加结果重新赋值给y 00461855 mov ecx,dword ptr [ebp - 8] //取y 00461858 push ecx //入参y 00461859 push offset string "%d \n" (0467B30h) 0046185E call _printf (0461046h) 00461863 add esp,8 return 0; } ``` ## 二、关系运算符 ```c < <= > >= == != ``` > 关系运算符的值只能是0或1 0假 1真 ## 三、逻辑运算符 ```c ! && || 非 逻辑与(并且) 逻辑或(或者) ``` ## 四、位运算符 ```c << 左移 >> 右移 ~ 非 | 或运算 ^ 异或运算 & 与运算 ``` 