printf(“%d,%d\n“,i--,i++) 不念不忘少年蓝@ 2023-01-10 13:09 167阅读 0赞 // sample.cpp #include<iostream> using namespace std; int main(){ int i=1; printf("Case 1: %d,%d\n",i--,i++); i=1; printf("Case 2: %d,%d\n", i++, ++i); i=1; printf("Case 3: %d,%d,%d\n", i++, ++i, ++i ); return 0; } 运行结果: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTAxMjEz_size_16_color_FFFFFF_t_70][] 原因: 参考链接:[https://blog.csdn.net/u014644714/article/details/77688321][https_blog.csdn.net_u014644714_article_details_77688321] \--- 首先看几种情况 1、 int i=1; printf("%d,%d\n",i--,i++); 运行结果为:2,1 这与编译器有关,通过汇编可以很清楚的看到 ![Center][] 第一步:把i的值存入缓存器\[ebp-0E8h\]=1; 第二步:i值加1,i=i+1=2; 第三步:把i的值存入缓存器\[ebp-0ECh\]=2; 第四步:i值减1,i=i-1=1; 第五步:把缓存器\[ebp-0E8h\]=1,入栈 第六步:把缓存器\[ebp-0ECh\]=2,入栈 故,打印输出为 2,1 总结: 由++或者--运算的顺序是从右向左,故先计算i++,i++在计算过程中会产生缓存区,返回的值就是缓存区的值,既是在加1之前需要先备份,这里的缓存区地址就是\[ebp-0E8h\]=1, 之后,i=i+1=2; 同理,第二个表达式的缓存区\[ebp-0ECh\]=2, 之后,i=i-1=1; 然后把第一,第二个表达式的返回值分别入栈【1,2】故输出为 2 1; 2、 int i=1; printf("%d,%d\n",i++,++i); ![Center 1][] 第一步:i值加1,i=i+1=2; 第二步:把i的值存入缓存区\[ebp-0E8h\]=2; 第三步:i值加1,i=i+1=3; 第四步:把i=3,入栈 第五步:把缓存区\[ebp-0E8h\]=2,入栈 故,输出为2,3 总结: 由++或者--运算的顺序是从右向左,故先计算++i,\++i的返回值为i本身,本应该是2,但是后面的运算却影响i的值,另外printf输出流的缓存栈是在所有表达式计算完后再入栈的,只需要知道首先入栈的是i的地址里面存的值, 下面该表达式i++,i++在计算过程中会产生缓存区,返回的值就是缓存区的值,既是在加1之前需要先备份,这里的备份地址就是\[ebp-0E8h\]=2,之后i=i+1=3,返回的值为缓存区\[ebp-0E8h\]=2,第二次入栈的就是第二个表达式的返回值\[ebp-0E8h\]=2,而第一次入栈的是第一个表达式的返回值i的值(此时已经改为3),故输出栈里面是【3,2】,打印输出 2,3. 下面的几个例子是具有两个变量的,道理是类似的,要注意,具有后置++/--的,返回的都是缓存区的值,前置的都是返回变量本身的值,另外本身的值可能受另一个表达式的影响,所以,在没有计算完之前,是不知道i的值的。 1、 int x=2,y=3; printf("%d,%d\n",(x++)+y,++y);//等价x+++y 第一个入栈的是y值本身,而其他表达式对其无影响,故入栈y==4 第二个入栈的是表达式的缓存区的值,为x+y=2+4=6,故入栈 6 输出值为6 4 下面的例子可以自己分析试试,看看反汇编就立刻明白含义了,就不一一说明了 2、 int x=2,y=3; printf("%d,%d\n",x+y++,++y); 3、 int x=2,y=3; printf("%d,%d\n",x+y,++y); 4、 int x=2,y=3; printf("%d,%d\n",x+y,y++); [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTAxMjEz_size_16_color_FFFFFF_t_70]: /images/20221119/3b3abeea91fe41ef8dddd097952c6e97.png [https_blog.csdn.net_u014644714_article_details_77688321]: https://blog.csdn.net/u014644714/article/details/77688321 [Center]: https://img-blog.csdn.net/20170829213113192?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDY0NDcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center [Center 1]: https://img-blog.csdn.net/20170829214603983?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDY0NDcxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
还没有评论,来说两句吧...