繁体   English   中英

C和赋值中的stdbool.h bool类型按位互斥或^

[英]bitiwise exclusive or ^ with stdbool.h bool types in C and assignment

我有一个玩具程序,其中使用<stdbool.h>库使用类型bool 我有一些bool数组,以下命令循环运行。

我已经在线阅读了我不应该对布尔使用逐位逻辑。 他们似乎在这里工作。 这仅仅是我的编译器的运气不好,还是我只是误解了有关按位运算符的警告?

#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");
}

在C中, truefalse的值分别为10 这样就可以了。

但是,您必须记住,所有非零值均为“ true”。 因此,除非您具有true1 ,否则其他任何“ true”值都将无法执行按位运算所期望的操作。

示例: 21均为“ true”,但2 & 1不是 “ true”。

我已经在线阅读了我不应该对布尔使用逐位逻辑。 他们似乎在这里工作。 这仅仅是我的编译器的运气不好,还是我只是误解了有关按位运算符的警告?

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

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

正如其他人已经指出,这更多的是关于的布尔解释- _Bool总比关于位运算_Bool秒。 具体而言,按位操作,其中操作数中的至少一个是非的结果的布尔解释_Bool不一定一样的相应的逻辑操作的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM