printf(“%d,%d\n“,i

阅读: 评论:0

printf(“%d,%dn“,i

printf(“%d,%dn“,i

// sample.cpp#include<iostream>
using namespace std;int main(){int i=1;printf("Case 1:	%d,%dn",i--,i++);i=1;printf("Case 2:	%d,%dn", i++, ++i);i=1;printf("Case 3:	%d,%d,%dn", i++, ++i, ++i );return 0;
}

运行结果:

 

原因:

参考链接:

 

---

首先看几种情况

1、

int i=1;
printf("%d,%dn",i--,i++);
运行结果为:2,1

这与编译器有关,通过汇编可以很清楚的看到

第一步:把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,%dn",i++,++i);

 

第一步: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,%dn",(x++)+y,++y);//等价x+++y

 

第一个入栈的是y值本身,而其他表达式对其无影响,故入栈y==4

第二个入栈的是表达式的缓存区的值,为x+y=2+4=6,故入栈 6

输出值为6 4

下面的例子可以自己分析试试,看看反汇编就立刻明白含义了,就不一一说明了

2、

int x=2,y=3;
printf("%d,%dn",x+y++,++y);


3、

int x=2,y=3;
printf("%d,%dn",x+y,++y);

 

4、

int x=2,y=3;
printf("%d,%dn",x+y,y++);
 

 

本文发布于:2024-02-03 00:28:50,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689132847462.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:printf
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23