小智 32

回答你的问题
.

会发生什么事情
会发生:

int x = 1; /* ASSUME THIS IS SO */
y = x = x + 1;

/* Results: */
y == 2;
x == 2;
Run Code Online (Sandbox Code Playgroud)

如何编译
同样如下:

x += 1;
y = x;
Run Code Online (Sandbox Code Playgroud)

为什么这不是未定义
因为您没有x在同一个表达式中编写,所以您可以阅读它.您只需将其设置为自身+ 1,然后分配y给值x.

您的未来
如果您发现代码令人困惑,您可以使用括号来提高可读性:

y = x = (x + 1);
Run Code Online (Sandbox Code Playgroud)

  • 我认识的唯一一个写"1 == x"之类的开发人员是我不会合作的人...... (34认同)
  • @andre:不,"开发者"不喜欢写那个.这是严重的,不洁净的,无用的; 加入过去十年,打开编译器警告. (19认同)
  • 仅仅为了你的信息,muntoo,作为赋值的"返回值"是它自己的值,你也可以将它用于其他东西,比如`if(1 == x = 1)`,这是一个非常常见的bug和原因,开发人员更喜欢写`1 == x`而不是`x == 1`(因为你不能将x分配给1). (2认同)

Nik*_*sov 17

不,你的表达是正确定义的.你可能正在寻找y = x = x++;,但事实并非如此.


Chr*_*utz 9

不会.您只需修改x一次,并且由于=该分配的右关联性在分配之前发生y.即使它确实发生过,但仍然只有一个修改x.您的陈述与法律一样合法y = ++x.