逻辑运算符

时间:2016-03-02 10:27:33

标签: c bitwise-operators logical-operators

我遇到了一个答案,我似乎无法弄清楚为什么这是对的。

因此有两个int变量x和y,它们分别代表0x66和0x39。

问题是基于表达式的结果值是什么。

x && y is apparently 0x01 (1)
x || y is 1
!x || !y is 0
x && ~y is 1

根据我的想法,我认为只要一个论点不为零就认为是真的。因此,只要x和y是一些非零值,那么&&运算符会产生1,当然只要其中一个是真的||运营商会产生1.

那为什么第三个问题是0?是个 !与bitwise~运算符不同?所以原来x是二进制的0101 0101,因为它不是零,在逻辑意义上它是真的,但是!它会是假的,还是它的数字的补码所以它的1010 1010?

4 个答案:

答案 0 :(得分:1)

布尔结果总是为true或false,在C中,true由1表示,false由0表示。

逻辑非运算符!给出布尔结果,即10。因此,如果表达式为“true”(即非零),则对该表达式应用!将使其为假,即0

在您的示例中,您有!x || !y。首先评估!x,并将其计算为false,导致!y被评估,并且它也计算为false,因此while表达式变为false,即0

答案 1 :(得分:0)

是的,!与按位而不是~不同。这是合乎逻辑的。它产生0或1。

答案 2 :(得分:0)

〜(0x01)将为0x10和 !(0x01)将为0x00

'〜'是一个按位运算符。 '!'是一个逻辑运算符。

答案 3 :(得分:0)

  

从我的想法来看,我认为只要一个论点不是   零被认为是真的。所以只要x和y是非零的   价值然后&&运算符会生成1,当然只有1   他们是真的||运算符会生成1。

这都是正确的。

class LatLng {
    lat?: number;
    lng?: number;

    constructor(lat: number, lng: number) {
        this.lat = lat;
        this.lng = lng;
    }

    toJSon() {
        return JSON.stringify({ this.lat, this.lng });
    };
}

是。这是合乎逻辑的。就像其他逻辑运算符So why is the third question 0? Is the ! different from the bitwise ~ operator? &&一样,它只关心变量是否具有非零值。

||将产生!0

1将产生!non_zero

请注意,C中的所有逻辑运算符都生成类型0而不是int,因为从C具有布尔类型之前的时间仍然是一种丑陋的向后兼容性。在C ++和其他类C语言中,逻辑运算符总是产生类型bool

同样,C中的booltrue实际上只是扩展为整数false1的宏。在其他语言中,它们是关键字和布尔常量。