不同C++编译器处理cout输出结果不一致的问题咨询
问题分析:C++代码在不同编译器输出不同的原因
你的猜测完全正确——这是编译器求值顺序不同导致的,属于C++标准中的未定义行为,因此不存在“唯一正确”的结果,两种输出都符合标准规定。
代码执行步骤拆解
先梳理到输出前的状态:
- 构造
A a时,a.a.a和a.a.b被初始化为1。 - 执行
a.a.a = 0后,a.a结构体的成员为a=0,b=1。 - 第一次调用
a.b():函数交换a.a.a和a.a.b的值,返回原a.a.a(即0)。此时a.a.a=1,a.a.b=0。
关键问题点:输出语句的求值顺序
问题出在这一行:
cout << a.b() << a.a.b << endl;
C++标准未规定<<运算符多个操作数的求值顺序。编译器可以选择两种执行顺序:
- 顺序1:先调用
a.b(),再读取a.a.b- 调用
a.b():交换当前a.a.a(1)和a.a.b(0),返回1;交换后a.a.b变为1。最终输出1+1=11。
- 调用
- 顺序2:先读取
a.a.b,再调用a.b()- 先读取
a.a.b的值为0,再调用a.b()返回1。最终输出1+0=10。
- 先读取
因为标准没有强制要求求值顺序,两种编译器的行为都符合规范,所以没有哪个结果是“错误”的。
内容的提问来源于stack exchange,提问作者João Ferrão
相关产品推荐
相关产品推荐

