单目运算符:单目运算符是指运算所需变量为一个的运算符,即在运算当中只有一个操作数,又叫一元运算符,其中有逻辑非运算符:!、按位取反运算符:~、自增自减运算符:++, --等。
//i++
void Function()
{
int a = 0;
int b = a++;
printf("%d %d",a,b);
}
//0040B518 mov dword ptr [ebp-4],0 a = 0;
//0040B51F mov eax,dword ptr [ebp-4] eax放入0
//0040B522 mov dword ptr [ebp-8],eax 将eax的值给b,b = 0
//0040B525 mov ecx,dword ptr [ebp-4] ecx = a = 0;
//0040B528 add ecx,1 ecx+1=1
//0040B52B mov dword ptr [ebp-4],ecx a = ecx = 1
//所以结果a = 1;b = 0 先赋值,再运算
//++i
void Function()
{
int a = 0;
int b = ++a;
printf("%d %d",a,b);
}
//0040B518 mov dword ptr [ebp-4],0 a = 0
//0040B51F mov eax,dword ptr [ebp-4] eax = a = 0
//0040B522 add eax,1 eax = eax + 1
//0040B525 mov dword ptr [ebp-4],eax a = eax = 1
//0040B528 mov ecx,dword ptr [ebp-4] ecx = a = 1
//0040B52B mov dword ptr [ebp-8],ecx b = ecx = 1
所以结果 a = 1;b = 1;先运算,再复制
三目运算符:
表达式?值1:值2;
void Function()
{
int a = 1;
int b = 2;
int c = a > b?a:b;
}
//0040B818 mov dword ptr [ebp-4],1 a = 1
//0040B81F mov dword ptr [ebp-8],2 b = 2
/0040B826 mov dword ptr [ebp-0Ch],0 c = 0
//0040B82D mov eax,dword ptr [ebp-4] eax = 1
//0040B830 cmp eax,dword ptr [ebp-8] a和B比较
//0040B833 jle Function+3Dh (0040b83d) a小于等于b跳转到 40b83d
//0040B835 mov ecx,dword ptr [ebp-4] 不成立继续执行 ecx = a
//0040B838 mov dword ptr [ebp-10h],ecx c = ecx = 1
//0040B83B jmp Function+43h (0040b843) 跳转到40b843 结束
//0040B83D mov edx,dword ptr [ebp-8] a小于等于b跳到这里执行 ebp-10h = b = 2
//0040B840 mov dword ptr [ebp-10h],edx ebp-10h = edx = 2
//0040B843 mov eax,dword ptr [ebp-10h] eax = 2
//0040B846 mov dword ptr [ebp-0Ch],eax c = eax = 2
结果:c = b,和if..else一样
if语句执行条件:
如果有两个操作数进行比较会直接cmp两个操作数,如果只有一个操作数会用这个操作数和0进行比较,若等于0不执行,非0则执行
如果if条件是立即数,会用test进行运算设置标志位,je(相等(为0)则跳转zf=1)来控制跳转