【发布时间】:2023-01-12 00:22:39
【问题描述】:
#include<stdio.h>
int main()
{
int a=4;
int b=4;
int c= a++ < ++b? 1 : 0;
printf ("%d",c);
}
已知在?处有一个序列点,这意味着前缀和后缀操作都必须在该点完成。还知道(?) b 在比较之前递增。但是,a是在比较前还是比较后自增?
如果它在 < 测试之前递增,则布尔值评估为 false,c 设置为 0,否则为 true,c 设置为 1。在我的编译器中,它评估为 true,这意味着 @ 987654328@在与c设置为1的比较运算后执行。
这种行为是规范的一部分吗?
我修改为
#include<stdio.h>
int main()
{
int a=4;
int b=4;
int d=2;
int c= a++ + d < ++b + d? 1 : 0;
printf ("%d",c);
}
它仍然评估为 1。后缀必须在 ? 之前完成,但这是否真的确保它发生在比较 < 之后?
【问题讨论】:
-
a比较后递增。后递增,因此使用未递增的值。 -
int c= a++ < ++b? 1 : 0;可以直接替换为int c= a++ < ++b;,尽管我可能会使用int c= (a++ < ++b);来明确将布尔比较结果分配给c的意图。
标签: c postfix-operator