几天前,这里有一个关于表达方式的讨论
i = ++ i + 1
是否调用UB(未定义的行为).
最后得出的结论是它调用UB,因为'i'的值在两个序列点之间不止一次变化.
我参与了与Johannes Schaub在同一个线程中的讨论.据他介绍
i =(i,i ++,i)+1 ------(1)/*也调用UB*/
我说(1),因为先前的子表达式的副作用是由逗号运算符清零不调用UB""之间i和i ++和我++和我之间.
然后他给出了以下解释:
"是的,在i ++完成之前的所有副作用之后的序列点,但没有任何东西可以阻止赋值副作用与i ++的副作用重叠.潜在的问题是赋值的副作用未指定发生在或之后在评估赋值的两个操作数之前,所以序列点在保护它时无法做任何事情:序列点诱导偏序:只是因为在i ++之后和之前有一个序列点并不意味着所有的副作用都被排序关于我.
另外,请注意,只有序列点没有任何意义:评估的顺序不是由代码的形式决定的.它由语义规则决定.在这种情况下,没有语义规则说明何时在评估那些操作数的操作数或子表达式时发生赋值副作用".
用"大胆"写的声明使我感到困惑.我所知道的:
"在执行序列中称为序列点的某些特定点,先前评估的所有副作用都应完整,并且不会产生后续评估的副作用."
因为,逗号运算符也指定了执行顺序,当我们到达最后一个i时,i ++的副作用已被取消.如果未指定评估顺序,那么(Johannes)会是正确的(但是在逗号运算符的情况下,它已被明确指定) ).
所以我只想知道(1)是否调用UB?有人能给出另一个有效的解释吗
谢谢!
我的问题与它有关,但有点不同,这是Johannes Schaub-litb对Oli Charlesworth回答的评论的结果.
是i = (0, ++i, 0)未定义的行为?
PS:这仅用于教育目的,与现实生活中的代码或示例无关.如果您只想添加"为什么关心?没有人在现实世界的应用程序中使用它"这样的评论,请忽略这个问题.等等
TIA