0

当我试图弄清楚时,!0' 的结果是定义的实现,期望它不等于零我只是读了一些让我感到困惑的东西。

(顺便说一句,它可能是在某些实现上-1,还是1严格定义?如果有人能在评论中告诉我会很好)

但我真正的问题是:

6.5.17 逗号运算符 2

据说:

如果尝试修改逗号运算符的结果或在下一个序列点之后访问它,则行为未定义。

在下一行中,有一个示例如何使用逗号运算符将参数解析为函数。

f(a, (t=3, t+2), c);

但是这个例子是到目前为止我所知道的未定义行为,不是吗?由于t被分配3并且在下一个序列中它增加了2.

但是该标准没有提到该示例无效。

或者是一个分配不被理解为修改?

4

3 回答 3

3
  1. !0评估为1
  2. (t=3, t+2)中,在赋值和访问之间存在一个序列点t。表达式已定义,它的计算结果为5并将值保留3t. 如果两者之间没有序列点,它将是未定义的,例如(t=3)+(t+2).
于 2013-09-19T08:16:06.500 回答
1

我不确定是什么促使你提出这个问题。您从中选择示例的标准部分清楚地说明了:

如语法所示,逗号运算符(如本小节所述)不能出现在使用逗号分隔列表中的项目(例如函数的参数或初始化程序列表)的上下文中。另一方面,在这种情况下,它可以用在带括号的表达式中或条件运算符的第二个表达式中。在函数调用中

        f(a, (t=3, t+2), c)

该函数有三个参数,第二个的值为 5。

强调相关部分以澄清您的疑问。

于 2013-09-19T08:21:11.683 回答
0

逗号运算符引入了一个序列点,因此应该很好地定义行为(首先t设置为3,然后2添加到t产生结果5但保持3t)。

于 2013-09-19T08:15:41.833 回答