【发布时间】:2025-12-20 08:40:17
【问题描述】:
程序
#include <stdio.h>
int main(void)
{
int i, j, k;
i = 1; j = 1; k = 1;
printf("%d ", ++i || ++j && ++k);
printf("%d %d %d", i, j, k);
return 0;
}
结果
1 2 1 1
我期待 1 1 2 2。为什么?因为 && 优先于 ||。所以我按照以下步骤操作: 1) j 加 1,所以 j 现在值为 2... 2) k 加 1,所以 k 现在值为 2... 3) 2 && 2,计算结果为 1... 4) 作为|| 的右操作数,无需进一步求值为真,因此由于逻辑表达式的短路行为,整个表达式必须为真...
为什么我错了?
【问题讨论】:
-
这个练习在我的教科书中,根据它,这里没有未定义的行为。
-
这意味着你正在阅读一本非标准的书。
-
@al-Acme:
||和&&引入序列点。 -
@Mat - 啊,阅读问题的速度太快了。 ://
-
请不要写这种代码 - 充其量很难阅读。
标签: c