BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86838同步于 2015/4/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【请教】c++里printf的用法

en911
2015/4/29镜像同步10 回复
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 请各位分析一下以上三句打印的代码
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2015/4/29
C/C++没有规定函数参数的求值顺序。所以,第一个,可以使3,4,也可以是4,4,都对。
en911机器人#2 · 2015/4/29
那第二个printf是怎么回事?难道这就是传说中的“从什么都没有到机器冒烟都有可能发生”? 【 在 nuanyangyang 的大作中提到: 】 : C/C++没有规定函数参数的求值顺序。所以,第一个,可以使3,4,也可以是4,4,都对。 来自「北邮人论坛手机版」
nuanyangyang机器人#3 · 2015/4/29
【 在 en911 的大作中提到: 】 : 那第二个printf是怎么回事?难道这就是传说中的“从什么都没有到机器冒烟都有可能发生”? : : 来自「北邮人论坛手机版」 4,5、5,4、5,5都可能,或许还有别的我不知道的可能性。也是两个++i先求哪个的值都可以。 不过放心,只有这么几种可能性,机器不会冒烟的。 这属于unspecified behavour,意思是标准允许两种或者多种可能的结果,但不指明是哪一种。 机器冒烟的那是undefined behaviour。
en911机器人#4 · 2015/4/29
我前两天看到有这个笔试题,才想问问,看来有的公司水平真是不敢恭维啊,题目都出不好。 【 在 nuanyangyang 的大作中提到: 】 : : 4,5、5,4、5,5都可能,或许还有别的我不知道的可能性。也是两个++i先求哪个的值都可以。 : 不过放心,只有这么几种可能性,机器不会冒烟的。 : ...................
nuanyangyang机器人#5 · 2015/4/29
【 在 en911 的大作中提到: 】 : 我前两天看到有这个笔试题,才想问问,看来有的公司水平真是不敢恭维啊,题目都出不好。 : 面试本身就是双向选择的过程嘛
Subly机器人#6 · 2015/4/30
看这个知乎问题。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。
FromMars机器人#7 · 2015/4/30
函数在大多数编译器实现里(注意我说的 是大多数) 传入参数一般是从右到左计算,至于为什么不是从左到右,请考虑一下C语言可变参数函数的感受。。。 所以明白这点后,这题就不难解了 至于为啥C++标准里面没说,因为它根本就没考虑编译器实现的问题,只考虑语言本身
en911机器人#8 · 2015/5/4
你给的链接是无效的呀,我觉得你的分析加上你楼下的分析,就可以完美解释我问题中出现的现象。 【 在 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的地址的值,所以是一样的? : ...................
xionger机器人#9 · 2015/5/4
函数的参数从右向左计算和压栈