2015-09-05 4 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 имеет значение true, если server[i].type не равно -1.

С другой стороны, из-за !server[i].type==-1operator precedence вычисляется как (!server[i].type) == -1, который никогда не собирается быть правдой, потому что левая сторона либо будет 0 или 1, если 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 эквивалентен (!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).

+0

Я не уверен, что справедливо сказать, что логические правила C++ «по расширению» из C, поскольку у него были реальные булевы типы задолго до того, как C сделал. Все C было тем, что можно было бы щедро описать как собрание библиотек. Нет? –

+0

О, и это выражения, а не утверждения :) –

+1

Наконец, «его» не «это», пожалуйста. –

Смежные вопросы