首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双排他性或^与stdbool.h bool类型在C和赋值中

双排他性或^与stdbool.h bool类型在C和赋值中
EN

Stack Overflow用户
提问于 2018-02-02 18:10:36
回答 2查看 366关注 0票数 2

我有一个玩具程序,在这个程序中我使用<stdbool.h>库来使用bool类型。我有几个bool数组,下面的命令在一个循环中工作。

我在网上读到,我不应该用一些聪明的逻辑来形容嘘声。他们似乎在这里工作。这只是我的编译器的运气,还是我只是误解了关于按位运算符的警告?

代码语言:javascript
复制
#include <stdio.h> 
#include <stdbool.h>

#define N 5
int main(void) {
  bool a[N] = { true, true, false, false, false };
  bool b[N] = { true, false, false, true, false };

  /* to count how many pairs are opposite */
  int count = 0;
  for (int i = 0; i < N; ++i){ count += (a[i] ^ b[i]); } 
  printf(" # pairs opposite: %i\n", count);

  /* flip the values of a */
  for (int i = 0; i < N; ++i){ 
        a[i] = (a[i] ^ true);
        printf(" %i", a[i]);
  } 
  printf("\n");

  /* flip only the value of a that are true in b */
  for (int i = 0; i < N; ++i){ 
        a[i] = (a[i] ^ b[i]);
        printf(" %i", a[i]);
  } 
  printf("\n");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-02 18:15:19

在C中,truefalse的值分别是10。那会很好的。

然而,你必须记住,所有非零的东西都是“真的”。因此,除非您有true1,否则任何其他“真”值都不会按照您的预期使用按位操作。

示例:21都是"true",但2 & 1不会是"true“。

票数 4
EN

Stack Overflow用户

发布于 2018-02-02 19:05:43

我在网上读到,我不应该用一些聪明的逻辑来形容嘘声。他们似乎在这里工作。这只是我的编译器的运气,还是我只是误解了关于按位运算符的警告?

stdbool的bool是标准_Bool类型的别名,标准声明它是标准的无符号整数类型之一。因此,_Bool值是位运算符的有效操作数,涉及它们的按位操作具有定义良好的结果。此外,当将任何标量值转换为_Bool类型时,结果要么为0,要么为1,这取决于原始值比较是否等于0。

因此,如果您认为警告告诉您编译器可能会拒绝您的特定示例代码,或者结果程序的行为可能与使用unsigned int代替_Bool不同,那么是的,您确实误解了这些警告。

正如其他人已经指出的,这更多地是关于非_Bools的布尔解释,而不是关于_Bools上的逐位运算。具体来说,对位操作的结果的布尔解释,其中至少一个操作数是非_Bool的,不一定与相应的逻辑运算的结果相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48588556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档