#include <iostream>
using namespace std;
bool func(char* m)
{
*m = '4';
return true;
}
int main()
{
char c1 = '3';
cout << "a" << c1 << func(&c1) << c1 << "b" << endl;
return 0;
}
just tell me what’s the output of this code.
a314b?
感觉挺合直觉的
@wodesuck 错。这里会触发c++的unspecifed的行为,参见:
http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
c++ 函数参数的求值顺序是不固定的,取决于编译器
对于这个具体的例子,假设我们把 operator << 重载的函数写作 op 那么这个的等价代码是 op(op(op(op(op(cout, "a"), c1), func(&c1), c1), "b"); 任意一个参数都可以先进行运算。 所以以下结果都有可能。 a314b a413b a313b a414b 我也是今天才知道……
这好象是个经典的undefined案例……
我是觉得应该避免为了压缩代码长度/偷懒/炫技从而破坏代码的工整性……
写表达式求值被 “if (ch == ‘-‘) return stack_pop() – stack_pop();” 这种东西坑过无数次之后已经学乖了…
另外 g++ 编译出来的是 a413b
那么C语言呢?一定从右到左吗?
应该也一样吧…. (至少应该是即使标准里面规定了也最好不要依赖的那种…)
g++ 4.7.2: a413b
clang 3.2: a314b
标准没定义的其实就该当错误。。
cpp初学者…「直接被臭虐啊摔」
cout那句一边修改c1一边读取c1的值,写这样的语句自然是玩火。
@Cruise Liu @Cruise Liu
你说的那行代码咋了?
@wl “-“号前后的pop不一定哪个先求值….
@yyc 啊!!!!学习了!!!!
@yyc 那好比int a = f() – g(); 只要f和g有依赖就可能出错?
@wl 好像是的……
@yyc 那我终于明白了为啥stl里top和pop都要分开,还是有道理的。
@Cruise Liu
其实 -O2 是 a414b。。。
c++ primer 和 TCPL里面这个问题已经强调无数遍了……