'(!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;
}
但我发现第一个不起作用。有人告诉我为什么会这样吗?非常感谢你。
答案 0 :(得分:5)
如果server[i].type != -1
不等于server[i].type
,则-1
为真。
另一方面,由operator precedence引起的!server[i].type==-1
评估为(!server[i].type) == -1
,这永远不会成为现实,因为左侧要么是0
或1
,除非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==-1
和a!=-1
”
由于!
是布尔运算符,!a
的结果定义为0
或1
。因此,如果a
非零,则为真(!a) → 0
,因此0==-1 → false
为(!0) → 1
,因此为1==-1 → false
!a==-1
。因此,表达式a!=-1
将始终产生错误。
!(a==-1)
将a的值与-1进行比较。它的布尔代数等价为k
。