当我试图找出时,!0
的结果是实现定义的,期望它不等于零我只是读了一些令我困惑的东西。
(顺便说一下,它可能是某些实现-1
或1
还是严格定义?如果有任何人可以在评论中说明会很好)
但我真正的问题是:
in
6.5.17逗号运算符2
说:
如果尝试修改逗号运算符的结果或者 在下一个序列点之后访问它,行为是未定义的。
在下一行中,有一个例子,说明如何使用逗号运算符将参数解析为函数。
f(a, (t=3, t+2), c);
但是这个例子就我所知到目前为止尚未定义的行为,不是吗?
自从t
被分配3
后,在下一个序列中,2
增加了{{1}}。
但标准并未提及该示例无效。
或者是一项不被理解为修改的作业?
答案 0 :(得分:3)
!0
评估为1
(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
。