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