ansi c 1999 TC3中的逗号运算符示例
当我试图弄明白时,ansi c 1999 TC3中的逗号运算符示例,c,c99,undefined-behavior,C,C99,Undefined Behavior,当我试图弄明白时,!0的结果是实现定义的,期望它不等于零。我刚刚读到一些让我困惑的东西 (顺便问一下,它可能在一些实现中-1或1,或者它的定义是否严格?如果有人能在评论中告诉我,那就好了) 但我真正的问题是: 在 6.5.17逗号运算符2 据说: 如果试图修改逗号运算符的结果或 在下一个序列点之后访问它,行为未定义 在下一行中,有一个示例,说明如何使用逗号运算符将参数解析为函数 f(a, (t=3, t+2), c); 但就我目前所知,这个例子是未定义的行为,不是吗? 由于t被分配3,在下一个
!0
的结果是实现定义的,期望它不等于零。我刚刚读到一些让我困惑的东西
(顺便问一下,它可能在一些实现中-1
或1
,或者它的定义是否严格?如果有人能在评论中告诉我,那就好了)
但我真正的问题是:
在
6.5.17逗号运算符2
据说:
如果试图修改逗号运算符的结果或
在下一个序列点之后访问它,行为未定义
在下一行中,有一个示例,说明如何使用逗号运算符将参数解析为函数
f(a, (t=3, t+2), c);
但就我目前所知,这个例子是未定义的行为,不是吗?
由于t
被分配3
,在下一个序列中,它增加了2
但是标准没有提到这个例子是无效的
还是一个赋值不能理解为修改?逗号操作符引入了一个序列点,因此行为应该被很好地定义(首先
t
被设置为3
,然后2
被添加到t
中,产生结果5
,但将3
保留在t
).逗号运算符引入一个序列点,因此行为应该被很好地定义(首先t
被设置为3
,然后2
被添加到t
中,产生结果5
,但将3
保留在t
中)
!0
计算结果为1
(t=3,t+2)
中,分配和访问t
之间有一个序列点。表达式已定义,其计算结果为5
,并将值3
保留在t
中。如果两者之间没有序列点,例如,(t=3)+(t+2)
,那么它将是未定义的!0
计算结果为1
(t=3,t+2)
中,分配和访问t
之间有一个序列点。表达式已定义,其计算结果为5
,并将值3
保留在t
中。如果两者之间没有序列点,例如,(t=3)+(t+2)
,那么它将是未定义的我不知道是什么促使你问这个问题。您从中选取示例的标准部分明确指出: 如语法所示,逗号运算符(如本款所述)不能 出现在使用逗号分隔列表中项目的上下文中(例如函数或列表的参数) 初始值设定者的名称)另一方面,它可以在带括号的表达式或 在这样的条件运算符的第二个表达式中 上下文。在函数调用中
f(a, (t=3, t+2), c)
该函数具有
三个参数,第二个参数的值为5
强调相关部分以澄清您的疑问。我不确定是什么促使您提出这个问题。您从中选取示例的标准部分明确指出: 如语法所示,逗号运算符(如本款所述)不能 出现在使用逗号分隔列表中项目的上下文中(例如函数或列表的参数) 初始值设定者的名称)另一方面,它可以在带括号的表达式或 在这样的条件运算符的第二个表达式中 上下文。在函数调用中
f(a, (t=3, t+2), c)
该函数具有
三个参数,第二个参数的值为5
强调了相关部分以澄清您的疑问。
但标准没有提到示例无效。
这意味着示例有效。是的,您不是说。。。但我的问题是为什么它是有效的?据我所知,规则不是==(等于)和!=(不等于)运算符与关系运算符类似,只是优先级较低。93)如果指定的关系为真,则每个运算符的结果为1,如果为假,则为0。我自己找到的。但是标准没有提到这个例子是无效的。
这意味着这个例子是有效的。是的,你不是说。。。但我的问题是为什么它是有效的?据我所知,规则不是==(等于)和!=(不等于)运算符与关系运算符类似,只是优先级较低。93)如果指定的关系为真,则每个运算符的结果为1,如果为假,则为0。我自己找到的。但是为什么printf(“%d%d”,t++,+++t)
无效呢?函数调用中的逗号不能理解为sequencepoint吗?@Zaibis完全正确。printf(“%d%d”,t++,+++t)
中的逗号不是逗号运算符,标准中说逗号运算符是序列点的段落不适用于它们。啊,那么解析到函数的参数是单个序列吗?@Zaibis函数调用中的参数是未排序的。这意味着其中两个不允许修改和修改或读取和修改同一内存位置。形容词“unsequenced”不是C99标准(我记得)的一部分,但它被非正式地用来描述两个没有被序列点分隔的表达式,例如in,但是为什么printf(“%d%d”,t++,+++t)
无效?函数调用中的逗号不能理解为sequencepoint吗?@Zaibis完全正确。printf(“%d%d”,t++,+++t)
中的逗号不是逗号运算符,标准中说逗号运算符是序列点的段落不适用于它们。啊,那么解析到函数的参数是单个序列吗?@Zaibis函数调用中的参数是未排序的。这意味着其中两个不允许修改和修改,或读取和修改mo