我有一个玩具程序,在这个程序中我使用<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");
}发布于 2018-02-02 18:15:19
在C中,true和false的值分别是1和0。那会很好的。
然而,你必须记住,所有非零的东西都是“真的”。因此,除非您有true或1,否则任何其他“真”值都不会按照您的预期使用按位操作。
示例:2和1都是"true",但2 & 1不会是"true“。
发布于 2018-02-02 19:05:43
我在网上读到,我不应该用一些聪明的逻辑来形容嘘声。他们似乎在这里工作。这只是我的编译器的运气,还是我只是误解了关于按位运算符的警告?
stdbool的bool是标准_Bool类型的别名,标准声明它是标准的无符号整数类型之一。因此,_Bool值是位运算符的有效操作数,涉及它们的按位操作具有定义良好的结果。此外,当将任何标量值转换为_Bool类型时,结果要么为0,要么为1,这取决于原始值比较是否等于0。
因此,如果您认为警告告诉您编译器可能会拒绝您的特定示例代码,或者结果程序的行为可能与使用unsigned int代替_Bool不同,那么是的,您确实误解了这些警告。
正如其他人已经指出的,这更多地是关于非_Bools的布尔解释,而不是关于_Bools上的逐位运算。具体来说,对位操作的结果的布尔解释,其中至少一个操作数是非_Bool的,不一定与相应的逻辑运算的结果相同。
https://stackoverflow.com/questions/48588556
复制相似问题