C/C++ 求值顺序example 2
#include<stdio.h> // 函数的入参是表达式的时候,先完成对各表达式求值(求值顺序不定) // 然后, 再将求值完成后得到的变量(或表达式返回的临时对象)的结果初始化行参。 // (注意,在执行被调函数前的最后时刻,副作用生效) // 注意:表达式 ++i 和 --i 作为函数入参, 其本质是将i自身作为入参,因为2者返回的是对象(运算过的)自己 // 所以, 函数在初始化形参时,使用的自然是i(毕竟,返回值是自己嘛) // i--和i++则返回的是i的副本(并非i) // 但,对于操作符, 取的是表达式的当前返回的结果 // 例如: *++p; 假定(其实必定,就算先运算*(++p) 子表达式)先运算子表达式++p, // 其运算结果在下一个顺序点到来之前,可能未从寄存器cpoy到内存。 // 而*操作符需要的只是对++p当前返回的(寄存器运算)结果进行处理 int main() { int i=1; int j=2; int a = 100; int b = 200; int c = 300; int d = 400; int e = 500; printf("%d%d%d\n",(--i),(++i),i); printf("%.3f a=%d b=%d\n",1.0,a,b); /* 111 1.000 a=100 b=200 */ // printf("%d%d%d\n",(b = --i),(a = ++i),i); // printf("%.3f a=%d b=%d\n",1.0,a,b); /*result: 121 1.000 a=2 b=1 */ i = 1; printf("%d%d%d%d%d%d%d\n",i,(e = i++),(d = i--),(c = --i),(b = ++i),(a = ++i),i); printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e); /* 2122322 a=2 b=3 c=2 d=2 e=1 */ // printf("j=%d%d\n", ++j, (++j)); // printf("j=%d\n", j); /* j=44 j=4 */ printf("j: %d %d\n", --j, ++j); printf("j=%d\n", j); /* j: 2 2 j=2 */ // 并非编译器优化的结果,而是先完成对各表达式求值(求值顺序不定) // (注意,在执行被调函数前的最后时刻,副作用生效),最后j=2, // 所以输出2 2 // printf("j: %d %d\n", j--, j++); // printf("j=%d\n", j); /* j: 3 2 j=2 */ // printf("j: %d %d\n", j--/*copy此时j的值给副本,j-1,返回副本,即实际打印了副本内容*/, ++j/*打印各入参表达式求值完成后,j最终的值*/); // printf("j=%d\n", j); /* j: 3 2 j=2 */ return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。