ansi c 1999 TC3中的逗号运算符示例

时间:2013-09-19 08:12:33

标签: c c99 undefined-behavior

当我试图找出时,!0的结果是实现定义的,期望它不等于零我只是读了一些令我困惑的东西。

(顺便说一下,它可能是某些实现-11还是严格定义?如果有任何人可以在评论中说明会很好)

但我真正的问题是:

in

  

6.5.17逗号运算符2

说:

  

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

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

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

但是这个例子就我所知到目前为止尚未定义的行为,不是吗? 自从t被分配3后,在下一个序列中,2增加了{{1}}。

但标准并未提及该示例无效。

或者是一项不被理解为修改的作业?

3 个答案:

答案 0 :(得分:3)

  1. !0评估为1
  2. (t=3, t+2)中,分配与t的访问之间存在一个序列点。表达式已定义,它的计算结果为5,并在3中保留值t。如果两者之间没有序列点,那么它将是未定义的,例如(t=3)+(t+2)

答案 1 :(得分:1)

我不确定是什么促使你问这个问题。你从这个例子中得到的标准部分清楚地说明了:

  

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

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

功能有   三个参数,第二个参数的值为5。

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

答案 2 :(得分:0)

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