我不理解此代码的输出:
long i=5, j=10;
if (++i || ++j) printf("%ld %ld\n", i, j);
else printf("Prog1\n");
输出为6和10.我预计6和11.为什么j
没有增加?
答案 0 :(得分:8)
逻辑OR运算符||
是short circut operator。这意味着如果只能通过查看左操作数来确定结果,则不会评估右操作数。
关于逻辑OR运算符的C standard的第6.5.14节说明了以下内容:
4 与按位
|
运算符不同,||
运算符保证 从左到右的评价;如果评估第二个操作数,则有 第一个和第二个的评估之间的序列点 操作数。 如果第一个操作数比较不等于0,则第二个操作数 操作数未被评估。
在这种情况下,计算++i
并且结果为6(具有递增i
的副作用。如果任一操作数不为零,则逻辑OR运算符求值为1(即为真)。由于左侧不为零,因此不评估右侧,随后j
不会递增。
答案 1 :(得分:2)
您的if条件使用短路的逻辑OR运算符||
。由于运算符(++i
)的左侧评估为true
,因此右侧(++j
)不会执行。
答案 2 :(得分:0)
++i
语句中仅执行了if
,因为++i
不为零且已被视为true
。由于||
OR操作,无需执行++j
。