运算符优先级,结果正确
Operator precedence, which result is correct?
可能重复:
未定义的行为和序列点
这个代码之后x
的值是多少?
int x = 5;
x = ++x + x++;
在Java中,结果是12,但在C++中,结果却是13。
我在谷歌上搜索了Java和C++的运算符优先级,它们看起来是一样的。那么,为什么结果不同呢?是因为编译器的原因吗?
在Java中,它被定义为求值为12。它的评估结果如下:
x = ++x + x++;
x = 6 + x++; // x is now 6
x = 6 + 6; // x is now 7
x = 12 // x is now 12
由于"先求值左手操作数",+
(++x(的左操作数在右操作数之前完全求值。另请参阅上一个答案和本答案,关于类似的主题,以及到标准的链接。
在C++中,它是未定义的行为,因为您在没有插入序列点的情况下修改了x三次。
运算符优先级控制如何将操作数分组在一起以计算结果。它不一定控制应用副作用的顺序。
在C++中,++
运算符都将在+
运算符之前计算(尽管这只会在++x
中产生差异,因为x++
的值与x
的值相同(。递增x
的副作用发生在C++中的下一个序列点之前,我们只能说,该表达式中唯一的序列点是在它被完全求值之后,包括赋值。此外,根据标准,在序列点之间多次修改对象的结果是明确未定义的。
给定未定义的行为,典型的实现将做一些取决于实现如何对定义的行为进行排序的细节的事情,因此,如果你坚持使用一个编译器的一个版本,你通常会得到一致的结果。
这是C++中未定义的行为。见本标准5.4。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- 表达式优先级?此结果如何发生
- 运算符优先级,结果正确