按乘积分配(乘法分配),以C++递增或递减

Assignment by product (multiplication assignment) with increment or decrement in C++?

本文关键字:分配 C++      更新时间:2023-10-16

为什么我们对以下两个语句得到不同的结果:

int x = 5;
x = x * x++;

输出是 26;而下一个示例返回 30,尽管它们是相同的?!

int x = 5;
x *= x++;

谢谢

它们在 C++03 和 C++11 中都表现出未定义的行为。在 C++11 术语中,您不能对同一标量进行两次非序列修改,也不能对同一标量进行修改和值计算,否则会出现未定义的行为。

x = x * x++;

在这种情况下,递增x(修改)与x的其他两个值计算不排序。

x *= x++;

在这种情况下,递增x是无序的,x的值计算在左侧。

有关未定义行为的含义,请参见C++11 §1.3.24:

未定义的行为
本标准未提出要求的行为

将 ++'d 值分配给原始值是未定义的行为。因此,分配一个++'d然后乘法的值也是没有定义的。