C中(二进制)逻辑运算符语句的行为

时间:2015-09-04 19:46:28

标签: c binary-operators

提前感谢您阅读和回答我的问题。 代码在这里:

  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     int i = 1;
  6     int j = 2;
  7     int k = 3;
  8 
  9     printf("%d\n", i < j || k);
 10 
 11     return 0;
 12 }

输出:1

我相信: 我&lt; j = 1 并且k = 3这是非零值,输出为1

我是否正在处理this?

我的信念是执行此二进制语句的第一部分(不评估|| k)。我是对的吗?

C99规范:

  

||运营商保证从左到右的评估;有一个   评估第一个操作数后的序列点。如果是第一个   操作数比较不等于0,不计算第二个操作数。

非常感谢任何解释此行为的其他信息。 我不经常问社区,但是在这种情况下我感到有些困惑,并会欣赏一些C-ninjas的一些信息。再次感谢。

2 个答案:

答案 0 :(得分:1)

在表达式i < j || k中,由于i小于j, 第一个子句为真,k未被评估。

但是,即使k 进行了评估,输出仍然是1。 例如,

       int i = 2;
       int j = 1;
       int k = 3;

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

由于i 小于j,因此第一个子句为false,第二个子句为 必须评估条款。由于k不为零,第二个条款为真, 并且整个表达式是&#34; true&#34;。分配给a的数值 &#34;真&#34;布尔表达式为1,因此输出为1.

答案 1 :(得分:0)

你得到的是逻辑测试的输出。逻辑测试可以是TRUEFALSE(1或0)。

当你这样做时

50 || 1

逻辑测试结果是TRUE(我假设您知道真值表)。 所以你的输出是1

然而,当你这样做时

50 | 1

结果为51

这个稍微修改过的程序版本证明了:

#include <stdio.h>

int main(void)
{
    int i = 1;
    int j = 2;
    int k = 3;

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

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

    return 0;
}
  • &&||是逻辑运算符,将返回逻辑值(TRUEFALSE)。
  • &安培;和|是二进制运算符,将返回二进制AND或OR位的结果。

Bitwise Operators