【发布时间】:2019-08-05 19:39:38
【问题描述】:
给定以下程序:
#include <stdio.h>
int main(void)
{
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%d\n", val); // prints 4
return 0;
}
val 的初始化似乎隐藏了一些未定义的行为,但我看不到对象被多次修改或在没有序列点的情况下修改和使用的任何点。有人可以
在这点上纠正或证实我?
【问题讨论】:
-
有序列点吗?请参阅this answer,其中指出有一个 “在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个被评估之间 (6.5.15)。”跨度>
-
你得到了 4。你期望什么?
-
我预计是 4。我认为这段代码不会调用 UB,但在另一个问题上有人告诉我它确实如此。只是想消除关于该特定陈述是否会导致 UB 的任何混淆,并可能得到比我在问题中提供的更好的解释。
-
三元表达式保证序列点。我找不到任何对
(++i > ++j)的引用。>是序列点吗? -
@Jean-FrançoisFabre 不,但不需要。两个不同变量的两次变化之间不需要序列点。
++i > ++i不过是 UB。
标签: c ternary-operator sequence-points