不同之处!a == - 1和a!= - 1

时间:2015-09-05 18:02:36

标签: c++

'(!server [i] .type == - 1)'之间的差异和'(服务器[i] .type!= - 1)'

服务器是一个结构数组,其类型和数量为两个成员。

server[0] type:-1 amount: 100
server[1] type: 0 amount:  50
server[2] type: 1 amount:  50

我想计算不是-1的类型总和。 我认为这两个代码是相同的

for(int i=0;i<3;i++) {
    if(!server[i].type==-1)
         total+=server[i].amount;
}

for(int i=0;i<3;i++) {
    if(server[i].type!=-1)
         total+=server[i].ptime;
}

但我发现第一个不起作用。有人告诉我为什么会这样吗?非常感谢你。

2 个答案:

答案 0 :(得分:5)

如果server[i].type != -1不等于server[i].type,则-1为真。

另一方面,由operator precedence引起的!server[i].type==-1评估为(!server[i].type) == -1,这永远不会成为现实,因为左侧要么是01,除非server[i].type operator!已超载......我认为并非如此。等效版本为!(server[i].type == -1)

答案 1 :(得分:1)

一元运算符!是布尔反转运算符,即

!true  → false
!false → true

二元运算符!=是“不等于”运算符,即“等于”的布尔反转

a != b → true <=> a == b → false

或写得略有不同

(a != b) == !(a == b)

注意将布尔逆运算符放在一对括号前面。原因是,布尔反转运算符的优先级高于布尔等式运算符。这意味着!a == b相当于(!a) == b

在C和C ++中,每个非零值都被认为是布尔值true,零是布尔值false。此外,布尔运算符的结果指定为0(→false)或1(→true)。

现在让我们看看你的两个不同的表达方式“!a==-1a!=-1

由于!是布尔运算符,!a的结果定义为01。因此,如果a非零,则为真(!a) → 0,因此0==-1 → false(!0) → 1,因此为1==-1 → false !a==-1。因此,表达式a!=-1将始终产生错误。

另一方面,

!(a==-1)将a的值与-1进行比较。它的布尔代数等价为k