返回信息流int i = 3;
printf("%d,%d\n", i, ++i);//打印 4,4
i=3;
printf("%d,%d\n", ++i, ++i);//打印 5,5
i = 3;
printf("%d,%d\n", i++, i++);//打印 4,3
请各位分析一下以上三句打印的代码
这是一条镜像帖。来源:北邮人论坛 / cpp / #86838同步于 2015/4/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【请教】c++里printf的用法
en911
2015/4/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
那第二个printf是怎么回事?难道这就是传说中的“从什么都没有到机器冒烟都有可能发生”?
【 在 nuanyangyang 的大作中提到: 】
: C/C++没有规定函数参数的求值顺序。所以,第一个,可以使3,4,也可以是4,4,都对。
来自「北邮人论坛手机版」
【 在 en911 的大作中提到: 】
: 那第二个printf是怎么回事?难道这就是传说中的“从什么都没有到机器冒烟都有可能发生”?
:
: 来自「北邮人论坛手机版」
4,5、5,4、5,5都可能,或许还有别的我不知道的可能性。也是两个++i先求哪个的值都可以。
不过放心,只有这么几种可能性,机器不会冒烟的。
这属于unspecified behavour,意思是标准允许两种或者多种可能的结果,但不指明是哪一种。
机器冒烟的那是undefined behaviour。
我前两天看到有这个笔试题,才想问问,看来有的公司水平真是不敢恭维啊,题目都出不好。
【 在 nuanyangyang 的大作中提到: 】
:
: 4,5、5,4、5,5都可能,或许还有别的我不知道的可能性。也是两个++i先求哪个的值都可以。
: 不过放心,只有这么几种可能性,机器不会冒烟的。
: ...................
【 在 en911 的大作中提到: 】
: 我前两天看到有这个笔试题,才想问问,看来有的公司水平真是不敢恭维啊,题目都出不好。
:
面试本身就是双向选择的过程嘛
看这个知乎问题。http://www.zhihu.com/question/29936562/answer/46129763
c++里的 i++,对i自增,但是返回的只是加一的一个数值;而++i,对i自增后,返回的是i的地址。所以c++里,可以++i=n,而不能i++=n;
另外,不知道输出语句中是否可认为是 逗号语句啊。前面的会进行计算,但是全部计算完之后才输出,所以输出 i,++i。输出的是i的地址的值,所以是一样的?
而输出 i++,i++,因为前一个输出的是计算后的值,而不是i的地址,所以是4,后一个是5。
函数在大多数编译器实现里(注意我说的 是大多数)
传入参数一般是从右到左计算,至于为什么不是从左到右,请考虑一下C语言可变参数函数的感受。。。
所以明白这点后,这题就不难解了
至于为啥C++标准里面没说,因为它根本就没考虑编译器实现的问题,只考虑语言本身
你给的链接是无效的呀,我觉得你的分析加上你楼下的分析,就可以完美解释我问题中出现的现象。
【 在 Subly 的大作中提到: 】
: 看这个知乎问题。http://www.zhihu.com/question/29936562/answer/46129763http://www.zhihu.com/question/29936562/answer/46129763。
: c++里的 i++,对i自增,但是返回的只是加一的一个数值;而++i,对i自增后,返回的是i的地址。所以c++里,可以++i=n,而不能i++=n;
: 另外,不知道输出语句中是否可认为是 逗号语句啊。前面的会进行计算,但是全部计算完之后才输出,所以输出 i,++i。输出的是i的地址的值,所以是一样的?
: ...................