1
15
如果首先计算左操作数,则
至于行为是否未定义,相关段落为:
如果首先计算左侧,那么我们将与第二句冲突,因为顺序是:
在步骤1中,将
|
2
13
关于引入序列点的函数调用,您是完全正确的。但是,该序列点并不能保存案例中的情况。 首先考虑这个简单的例子
有效吗?是的,是的。为什么?它是有效的,因为函数引入的序列点(您正在讨论的那个)分隔了函数的两个修改
但是,让我们回到您的变体
在这种情况下,序列点也存在。然而,语言并不能保证评价的顺序
|
3
1
表达式定义不明确: 对该表达式的有效解释是:
同样有效的解释是:
这两者都是有效的,并产生不同的结果。所以表达式有未定义的结果。 |
4
0
编辑:这是不正确的,但是我把它留在这里,因为下面的评论中的讨论是有启发性的,我希望是有价值的。 它是基于C(或C++)中操作符的评价顺序定义的。
“序列点”这个词有点夸张。序列点并不是真正创建的,它只是为语言定义了严格的求值顺序的结果。 编辑:虽然这个答案似乎在智力上令人满意,但詹姆斯·麦克内利斯的回答引用了C99规范中的相关部分,该部分指出任务的评估顺序是 不 定义明确。他确实核实了事实,这是他应得的全部荣誉。我将把我的答案从“它的定义很好”修改为“它可能是关于一个特定编译器的定义很好的”,因为我认为大多数编译器不太可能经常改变它们发出这些代码的顺序(我说“可能”是为了解释任何非常激进的优化)。 |