请考虑这些C代码:
if ((value & 1) == 1)
{
}
Run Code Online (Sandbox Code Playgroud)
假设值等于1,将(value & 1)返回1还是任何未指定的非零数字?
§6.5.8关系运算符
如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果是,则为0 false.)结果的类型为int.
§6.5.9平等运营商
==(等于)和!=(不等于)运算符类似于关系运算符,除了它们的优先级较低.)如果指定的关系为真,则每个运算符产生1,如果为假,则每个运算符产生0.结果是int类型.对于任何一对操作数,其中一个关系是正确的.
§6.5.13逻辑AND运算符
如果&&运算符的两个操作数都不等于0,则它将产生1; 否则,它产生0.结果类型为int.
§6.5.14逻辑OR运算符
|| 如果操作数的任何一个比较不等于0,则运算符应该为1; 否则,它产生0.结果类型为int.
C 语言中的“true”总是意味着 1 吗?
不。任何计算结果为非零值的表达式在 C 中都是“真”。例如,
if (-1) {
}
if (5-10) {
}
if( "string literal") {
}
Run Code Online (Sandbox Code Playgroud)
都是“真”并通过条件。
在您的具体示例中,关系运算符==产生 1,这也是“真”(Govind 指出的所有其他关系运算符也是如此)。
如果您真的要问&当value为1 时按位 AND ( ) 是否产生 1 ,那么是的,value & 1产生 1(假设value是整数类型——&运算符要求其操作数为整数)。
事实上,您可以尝试使用一个简单的程序来理解各个部分和(通常是&and==运算符的行为):
#include <stdio.h>
int main(void)
{
int value = 1;
printf(" value & 1 = %d\n", value & 1);
printf(" 2 & 1 = %d\n", 2 & 1);
printf("((value & 1) == 1) = %d", (value & 1) == 1);
}
Run Code Online (Sandbox Code Playgroud)