以下链式赋值是否会导致未定义的行为?

anj*_*ruu 6 c undefined-behavior

以下代码是否调用未定义的行为C

int a = 1, b = 2;
a = b = (a + 1);
Run Code Online (Sandbox Code Playgroud)

我知道以下内容调用UB:

a = b = a++;
Run Code Online (Sandbox Code Playgroud)

原因是它违反了标准中的以下条款:

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.

但是,第一个代码段不违反此条款.一位同事说这种说法a = b = a+1也可能意味着

a = a + 1;
b = a + 1;
Run Code Online (Sandbox Code Playgroud)

要么

b = a + 1;
a = b;
Run Code Online (Sandbox Code Playgroud)

我认为,由于"从右到左"的相关性=,它总是必须意味着a = (b = (a+1)),而不是

a = a + 1;
b = a + 1;
Run Code Online (Sandbox Code Playgroud)

不过,我并不积极.是UB吗?

Sou*_*osh 11

恕我直言,a = b = a+1定义明确.

这里.你没有改变它的价值a,只是在使用它时a+1.

明确地说,根据运算符的"从右到左"的关联=,你可以将上面的内容分解为,

b = a + 1;  //a does not change here, only the value is used.
a = b;
Run Code Online (Sandbox Code Playgroud)

  • 聪明的方法当然是像上面一样编写代码,而不是在一行上使用多个赋值。但是如果所有的 C 程序员(包括 Dennis Ritchie)都能够使用常识,我们就不会有这些关于运算符优先级和未定义行为的有趣讨论,那么 SO 上的流量就会大大减少!:) (2认同)