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

关于++的问题

casemonkey
2014/10/22镜像同步9 回复
#include<iostream> using namespace std; void he(int a,int b) { cout<<a<<endl; cout<<b<<endl; } int main() { int i=2; he(++i,i++); system("pause"); return 0; } 求大神看看,dev下跟VC6.0下运行结果不一样(dev下输出 4,2,VC下输出3,2),是什么原因导致的呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
FromMars机器人#1 · 2014/10/22
是不是能套用暖神的话: 未定义行为,从什么都不做到机器冒烟都有可能。。。 VC的结果比较好理解; 感觉dev是这样的: 先2参数传递i=2; 计算右边的++,3; 计算左边++,4; 1参数传递i,4; 具体看编译器实现吧 这种引起歧义的写法是不提倡的,好久之前有人贴过说明链接
karcy机器人#2 · 2014/10/22
编译器的问题?不懂 【 在 casemonkey (小白||坚持己心||戒躁||offer会有的) 的大作中提到: 】 : #include<iostream> : using namespace std; : void he(int a,int b) : ...................
ashjn2011机器人#3 · 2014/10/22
未定义行为,从什么都不做到机器冒烟都有可能。。。
nuanyangyang机器人#4 · 2014/10/22
【 在 FromMars 的大作中提到: 】 : 是不是能套用暖神的话: : 未定义行为,从什么都不做到机器冒烟都有可能。。。 : VC的结果比较好理解; : ................... 还好,这不是undefined behaviour,而是unspecified behaviour,机器不会冒烟的。 前者是那个意思,从什么都不发生到机器冒烟都可能。典型的例子: · 整数除以0 · 有符号整数溢出 · 移位运算<<、>>的右参数是负的 · 把浮点数转换成整数,但是那个浮点数太大了,这个整数类型表示不了 · 从NULL指针读数据 · 该返回值的函数执行到函数末尾页没遇到return语句 · …… 后者的意思是,有可能会发生多种结果中的一个,但标准并不规定是哪一个。比如 · 全局变量什么时间初始化(早晚得初始化,但肯定在使用之前) · 参数的求值顺序(按什么顺序求值都可以,n个参数就有n的阶程种不同的顺序,但必定是其中之一) · 两个字符串常量是否在不同的数组中存储(比如char *a="hello", *b="hello";这两个hello存在一起还是不存在一起都是允许的。但是它们不是存在一起,就是不存在一起,只有两种选择。) · 赋值表达式的左边先求值还是右边先求值(不是左边先,就是右边先。) · 连续调用malloc分配得到的空间是不是在一起的(不是在一起就是不在一起) …… 这个问题是求值顺序,就是那个++i和i++哪个先发生。C语言规定参数可以按任何顺序求值,所以,先求哪个值都可以,但肯定是先求参数的值后调用函数。所以这个是unspecified behaviour,机器是不会冒烟的。但是这个++的副作用可以拖到对i++求值之后很长的时间。所以,可能的情况很多,结果会是其中一个。
ajin机器人#5 · 2014/10/22
可能是编译器的解释问题吧,DEV太老了,我用DEV和vs2010测试过很多同样的程序,包括,sizeof啊,指针地址之类的,老多不同了,我都不想问了,反正也问不出什么结果。没啥大意思
nuanyangyang机器人#6 · 2014/10/22
楼主可以再试试下面这个例子: int a = printf("long\n")+printf("time\n")+printf("no\n")+printf("see\n"); printf("%d\n", a);
FromMars机器人#7 · 2014/10/23
soga~,谢谢暖神赐教 【 在 nuanyangyang 的大作中提到: 】 : : 还好,这不是undefined behaviour,而是unspecified behaviour,机器不会冒烟的。 : 前者是那个意思,从什么都不发生到机器冒烟都可能。典型的例子: : ...................
linbin机器人#8 · 2014/10/24
这个问题跟 a[i] = i++; 类似。跟编译器的处理顺序有关,所以不同编译器,可能会有不同的结果。
casemonkey机器人#9 · 2014/10/24
赞以上各位大神