Logical Operators in C

前端 未结 8 1999
说谎
说谎 2020-11-27 08:25

I am having trouble trying to understand how logical operators work in C. I already understand how the bit-level operators work, and I also know that logical operators treat

相关标签:
8条回答
  • 2020-11-27 09:04

    I tried to convert it to binary

    That might have got in the way of understanding. The exact bit-patterns of 0x65 and 0x55 are completely irrelevant to the required result, all that matters is that they're both non-zero. You could consider a = (0x65 && 0x55) to be equivalent to something like:

    if (0x65 != 0) goto condition_false;
    if (0x55 != 0) goto condition_false;
    a = 1;
    goto condition_end;
    condition_false:
    a = 0;
    condition_end:
    

    A given implementation might be able to emit code more efficient than that (although I have seen pretty much that code emitted, with each if ... goto being a test and branch in the assembly). The more-efficient code might involve some bit operations to avoid branches. For that matter, in this example involving constants the compiler would probably just emit a = 1;.

    The meaning of the && operator is in terms of conditional execution, though. For example if you write f() && g() then it is guaranteed that when f returns a false value, g is not called. If it's possible to get the same result by bit-twiddling then that's likely a bonus for performance.

    0 讨论(0)
  • 2020-11-27 09:07

    Any expression that evaluates to 0 is false. And any expression that is non-zero is true. So both 0x65 and 0x55 are true.

    0x65 && 0x55

    => true && true => true

    0 讨论(0)
  • 2020-11-27 09:08

    && operator:

    If the left operand and the right operand are both different than 0 it evaluates to 1 otherwise it evaluates to 0.

    If the left operand is 0, the right operand is not evaluated and the result is 0.

    0x65 && 0x55 is evaluated to 1.

    0 讨论(0)
  • 2020-11-27 09:10

    C defines values greater than zero to be "True". As both 0x65 and 0x55 match this condition, the result is also True - which, on output, is 1 - or, in hex notation, 0x01.

    An alternative style of writing for your code would be:

    return (0x65 is true) and (0x55 is true);

    0 讨论(0)
  • 2020-11-27 09:10

    As you said the logical operators treat nonzero arguments as representing

     (0x65 && 0x55) is equal as (0x65 > 0) && (0x55 > 0)
    
     0x65 > 0 get true and 0x55 > 0 get true as well
    
     So (0x65 && 0x55)  is equal true && true = 1
    
    0 讨论(0)
  • 2020-11-27 09:12

    && is a logical operator, not a bitwise operator. Both 0x65 and 0x55 are true, so the result is a true number. 0x01 is a true number.

    Binary representations only come into play for bitwise operations. The expression 0x65 & 0x55 is equal to 0x45.

    0 讨论(0)
提交回复
热议问题