是i = 0,++我定义了吗?

ere*_*eOn 23 c c++

我最近了解了,运算符以及引入序列点的事实.

我还了解到以下代码导致了未定义的行为:

i = ++i;
Run Code Online (Sandbox Code Playgroud)

因为i在两个序列点之间修改了两次.

但是下面的代码怎么样?

i = 0, ++i;
i = (0, ++i);
Run Code Online (Sandbox Code Playgroud)

虽然我知道规则,但我无法得出结论.它是否定义了行为?

编辑:就像@paxdiablo提到,定义与否,这是一个应该避免的不好的做法.这个问题仅用于教育目的和更好地理解"规则".

Oli*_*rth 27

是. =优先级高于,,所以这个表达式相当于(i = 0), ++i. ,是一个序列点,所以保证++i在赋值后发生.

我不确定是否i = (0, ++i)定义了.我的猜测是否定的; 增量和赋值之间没有序列点.

  • 序列点始终在评估之间,并对由它们引起的副作用进行排序."0"和"++ i"之间有一个序列点.但是@Oli指出,不是在赋值和增量之间.对于像`i =(0,++ i,0)`这样的例子,我认为C++ 03标准并不清楚.我认为你可以指出它的定义,但我永远不会依赖它:对我来说它也是未定义的. (4认同)
  • @codymanix:就像括号中没有定义`i =(++ i)`一样. (2认同)

Pra*_*rav 7

i = 0, ++i;
Run Code Online (Sandbox Code Playgroud)

正如另一个答案指出的那样,它不是未定义的行为.

i = (0, ++i);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,行为是未定义的,因为++ii 之间没有序列点和赋值.

i = (0, ++i, 0)
Run Code Online (Sandbox Code Playgroud)

行为在C++ 03,恕我直言中得到了很好的定义1.

1有关类似表达式的扩展讨论.