【问题标题】:Logical AND operator in c spitting out 1c中的逻辑与运算符吐出1
【发布时间】:2015-04-11 04:23:22
【问题描述】:
int a;
scanf("%i", &a);
printf("%i", a&&1);

在这个程序中,无论输入什么,它都会输出 1,即使我尝试偶数也是如此。唯一的例外是 a = 0。我可能没有正确理解 AND 运算符,但是对于任何偶数,输出不应该是 0 吗?

【问题讨论】:

  • 将标题更改为“c 中的 && 运算符吐出 1”或“c 中的逻辑与运算符吐出 1”会使这个问题更有价值。
  • 您的示例由于读取了未初始化的变量而调用了未定义的行为。
  • @EdS.:有点。无效输入是 UB,所以你说对了一半;他应该检查scanf的返回值。
  • 您需要使用按位比较运算符'&'来检查奇数,例如:num & 1
  • @TimČas:不;这是 UB,因为他正在读取 a && 1a,但 a 未初始化。读取一个未初始化的变量就是UB。

标签: c


【解决方案1】:

因为&& 运算符在其两个操作数都不为零时返回非零值。也许你的意思是&

int a;
if (scanf("%i", &a) == 1)
    printf("%i", a & 1);

【讨论】:

【解决方案2】:

运算符&& 是返回真/假的逻辑与运算符。 在 C 语言中 false 为 0(零),否则 1(一)为 true,因为 C 没有布尔类型。 所以你的操作符的结果是正确的并且符合预期。

如果你坚持使用 bool 类型,你可以在下面包含它的定义

// standard way
#include <stdbool.h>

基本上是

#define bool _Bool
#define true 1
#define false 0

【讨论】:

  • "C 没有布尔类型" 嗯 _Bool 是什么?
  • C 在过去 16 年中确实有一个布尔类型。见stackoverflow.com/questions/4767923/c99-boolean-data-type
  • _Bool 是一个 typedef int _Bool;
  • 使用 C99 和 C11 编译器,尝试 printf("%d %d\n", (_Bool) 0.9, (int) 0.9); 这将打印 "1 0",因为转换为 _Bool 与转换为 int 不同。如果“_Bool is a typedef int _Bool;”,也会出现同样的结果。
  • 不一定。数字 0.9 不是零(为假),而是为真(为 1)。这就是打印整数 1 的原因。此行为符合 _Bool 定义。
猜你喜欢
  • 2014-07-07
  • 1970-01-01
  • 2018-09-26
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多