目录
(1)前置加加和后置加加的区别
(2)printf输出前置加加
(3)printf输出后置加加
(4)printf输出printf
(1)前置加加和后置加加的区别
首先我们先来了解一下前置加加和后置加加的区别。
前置加加在编译器里的操作
//++a
int a = 0;
a = a + 1;
return a;
前置加加是先加一,后赋值,返回的值是加一之后的值。
后置加加在编译器里的操作
//a++int a = 0;
tmp = a;
a = a + 1;
return tmp;
后置加加是先把值赋给临时量,然后再加一,返回的值是临时量的值。
前置加加可以做左值,因为前置加加返回的是a的值,是可以进行操作的,后置加加则不可以,因为后置加加返回的是一个临时量,并不是程序中定义的可寻址变量,不能通过地址对temp进行操作。
(2)printf输出前置加加
#include<stdio.h>int main()
{int i = 1;printf("%d,%d\n",++i,++i);return 0;
}
printf函数计算参数的时候是从右往左压栈的。目的是为了计算参数的个数。编译器首先从右往左计算各参数的值,再进行压栈操作,最右端的"++i"的值是计算出来是2,保存在eax寄存器中,接着计算倒数第二个"++i"的值,给eax寄存器加一,保存为3,然后进行压栈,把eax寄存器里的i的地址放入栈中,此时输出的值是i的值,所以都是3.
(3)printf输出后置加加
#include<stdio.h>int main()
{int i = 1;printf("%d,%d\n",i++,i++);return 0;
}
最右端的"i++"的值为1,保存在临时量里,计算出i的值为2,倒数第二个"i++"的值为2,i的值为3,"i++"也保存在对应的临时量里,但是两个临时量保存的地址是不同的,进行压栈操作,压入的是保存两个临时量的地址,所以输出的是2和1.
汇编指令:
(4)printf输出printf
#include<stdio.h>int main()
{int i = 33;printf("%d\n",printf("%d ",printf("%d ",i)));return 0;
}
首先输出的第一个"33"是"i"的值,第二个"%d"算出来的是"33"的值的字节大小,占两个字节,还有空格的字节长度,一共是三个字节,所以输出的是"3",第三个"%d"算出来的是"3"的值的字节大小,占一个字节,还有空格的字节长度,一共是两个字节,所以输出的是2。