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)