首页 文章

C中的逻辑表达式误解

提问于
浏览
7

所以,我正在写一些代码,我在程序的一个部分中获得了意外的输出,这破坏了整个系统 .

我设法将问题提取并简化为基本的逻辑表达式 . 让我们说:

int i = 1, j = 1, k = 0;

printf("%d\n", ++i || ++j && k);
printf("%d, %d, %d\n", i, j, k);

return 0;

该程序的输出是:

1

2 1 0

由于 || 运算符的短路特性,我认为 j 的值没有增加到 2 . 但是我很困惑第一个 "%d" 的值是 1 . 对于 && 语句, k 的值是否应该为非零以返回 1 ?或者根本不执行此语句,因为 ++i || ++j 不是 0 因此返回 1

  • 我知道 && 是逻辑的,如果expr1 && expr2的值为 both 非零,则expr1 && expr2的值为1 .

任何澄清将不胜感激,请原谅这个问题的基本性质 .

4 回答

  • 7

    来自C标准(6.5.14逻辑OR运算符)

    3 ||如果操作数的任何一个比较不等于0,则运算符应该为1;否则,它产生0.结果类型为int .

    这个表达

    ++i || ++j && k
    

    相当于

    ++i || ( ++j && k )
    

    并且根据标准的引用,表达式返回整数值1,因为 ++i 不等于零 . 不评估子表达式 ( ++j && k ) .

  • 2

    运算符优先级 . && 的优先级高于 || .

    你的表达式与: ++i || (++j && k) 相同

    ++iTRUE ,不再评估括号 .

  • 3

    && 的优先级高于 || . (见https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B)所以

    ++i || ++j && k
    

    ++i || (++j && k)
    

    || shortcircuits如果第一个运算符是真的,根据6.5.14p4 .

    如果您使用 gccclang 并使用 -Wall 编译代码,编译器将轻推您将这些括号放在那里 . 听取这些建议可能是一个好主意,因为有些人会被优先级混淆(我听说) .

  • 1

    ++i || ++j && k 被评估为1(真)因为i等于2(1),因为短路而不评估(j && k) .

相关问题