2015-09-05 142 views
-4

'(!server [i] .type == - 1)'和'(server [i] .type!= - 1)'不同之間!a == -1和a!= -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; 
} 

但我找到的第一個不work.Can有人告訴我,爲什麼出現這種情況?非常感謝您。

+0

'!server [i] .type == - 1'〜'(!server [i] .type)== - 1' – Columbo

+0

缺少括號和缺少關於操作員偏好的研究是主要原因。 –

+0

如果一個「不工作」,你爲什麼會認爲「代碼」是相同的?您是否考慮過對所輸入符號的含義進行研究? –

回答

5

那麼server[i].type != -1如果server[i].type不等於-1爲真。

在另一方面,!server[i].type==-1由於operator precedence評估爲(!server[i].type) == -1,這是永遠不會因爲左側要麼將是01,除非server[i].type已經operator!超載是真實的......我敢假設情況並非如此。等效版本將是!(server[i].type == -1)

1

一元運算符!是布爾反轉操作者,即

!true → false 
!false → true 

的二進制運算符!=是「不等於」運算符,即布爾逆「等於」

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

或書面略有不同

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

Take注意將布爾逆運算符放在一對括號的前面。原因是,布爾反轉運算符比布爾相等運算符具有更高的優先級。這意味着​​相當於(!a) == b

在C和擴展C++中,每個非零值都被認爲是布爾值true,零值是布爾值false。此外,布爾運算符的結果被指定爲0(→false)或1(→true)。

現在,讓我們看看你的兩種不同的表現「!a==-1a!=-1

由於!是一個布爾運算符的!a結果被定義爲要麼0,或1。因此,在a非零的情況下,即,對於零(!0) → 1,因此1==-1 → false,即爲真(!a) → 0因此0==-1 → false。因此,表達式!a==-1將始終產生錯誤。

a!=-1另一方面是比較a的值與-1。其布爾代數等價物將是!(a==-1)

+0

我不確定這是否公平地說C++的布爾規則是C的「擴展名」,因爲它早在C之前就有了真正的布爾類型。所有的C都可能被慷慨地稱爲圖書館慣例。沒有? –

+0

哦,那些是表達式,不是語句:) –

+1

最後,「它」不是「它」是請。 –

相關問題