网络上有许多问题涉及位运算符和逻辑运算符之间的区别。希望我已经做了很好的搜索,没有一个专门研究它们在条件语句内部使用时是否相同,也没有一个专门提到C语言。大多数都是C++和C语言,我也不知道同样的答案是否也适用于C语言。
这是我为测试正在发生的事情而编写的示例代码:

// Difference between logical && and bitwise & //

#include <stdio.h>

#define TRUE 123>45
#define FALSE 4>2342

void print_tt(int table[][4]);

int main(void) {

    int and_tt[2][4];   // AND truth table
    int or_tt[2][4];    // OR truth table

    // Create truth table for logical and bitwise AND operator all in one 2d array
    and_tt[0][0] = TRUE && TRUE ? 1 : 0;
    and_tt[0][1] = TRUE && FALSE ? 1 : 0;
    and_tt[0][2] = FALSE && TRUE ? 1 : 0;
    and_tt[0][3] = FALSE && FALSE ? 1 : 0;
    and_tt[1][0] = TRUE & TRUE ? 1 : 0;
    and_tt[1][1] = TRUE & FALSE ? 1 : 0;
    and_tt[1][2] = FALSE & TRUE ? 1 : 0;
    and_tt[1][3] = FALSE & FALSE ? 1 : 0;

    // Create truth table for logical and bitwise OR operator all in one 2d array
    or_tt[0][0] = TRUE || TRUE ? 1 : 0;
    or_tt[0][1] = TRUE || FALSE ? 1 : 0;
    or_tt[0][2] = FALSE || TRUE ? 1 : 0;
    or_tt[0][3] = FALSE || FALSE ? 1 : 0;
    or_tt[1][0] = TRUE | TRUE ? 1 : 0;
    or_tt[1][1] = TRUE | FALSE ? 1 : 0;
    or_tt[1][2] = FALSE | TRUE ? 1 : 0;
    or_tt[1][3] = FALSE | FALSE ? 1 : 0;

    puts("_______AND_______");
    puts("Logical   Bitwise");
    print_tt(and_tt);

    puts("_______OR________");
    puts("Logical   Bitwise");
    print_tt(or_tt);

}


// prints the truth table of the bitwise and logical operator given side by side
void print_tt(int table[][4]) {
    int i;
    for(i=0; i<4 ; ++i) {
        printf("%-10s%s\n", table[0][i] ? "true" : "false",
            table[1][i] ? "true" : "false");
    }
}

程序的输出是:
_______AND_______
Logical   Bitwise
true      true
false     false
false     false
false     false
_______OR________
Logical   Bitwise
true      true
true      true
true      true
false     false

这证明了位运算符和逻辑运算符之间没有区别。将TRUEFALSE宏的定义更改为包含剩余的比较运算符,可以看到没有区别。
因此,如果存在差异,这些差异可能与编译器解释语句的方式或代码的效率有关。
总之,在特定情况下,当我们在条件语句中的比较操作的两个或多个结果之间有位运算符或逻辑运算符时,我们应该使用哪一个,主要是为了提高效率?

最佳答案

您只检查值01。尝试其他的价值观,你会发现差异。

int a = 4, b = 2;

puts(a && b ? "true" : "false");
puts(a & b  ? "true" : "false");

这张照片:
true
false

按位运算符只处理整数。逻辑运算符可以与指针、浮点数和其他非整数类型一起使用。
还有短路。如果第一个操作数足够,逻辑运算符就不会计算第二个操作数。
int a() { puts("a"); return 0; }
int b() { puts("b"); return 1; }

int main() {
    puts(a() && b() ? "true" : "false");
    puts("---");
    puts(a() & b()  ? "true" : "false");
}

这张照片:
a
false
---
a
b
false

注意使用b时如何打印&。没有短路,因此&调用两个函数,而&&只调用a()
另外,与&&不同,&不会对其操作数强制计算顺序。输出同样可以使ab打印输出反向。
a
false
---
b
a
false

如果你把这些差异都放在一边,那么是的,算符是等价的。在这种情况下,不要担心效率。使用语义正确的运算符:逻辑运算符。
(如果这有助于放松你的思想,那么效率就没有区别。编译器非常聪明,无论使用哪种运算符,都肯定会发出最佳字节码来计算这些表达式。)

关于c - C中条件语句中的按位运算符和逻辑运算符有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29810766/

10-10 23:10