2014-10-16 3 views
1

На языке C, что является результатом x=0, если я положил его в if-else состоянии? если он представляет false или если это назначение завершено, то укажите true?if-else условие в C

мой коллега писать код, как:

if(condition = 0) 
{ 
    //do process A 
} 
else 
{ 
    // do process B 
} 

очевидно, этот код не так, я знаю, что это должно быть condition == 0 или ((condition=foo()) == 0), но мое предположение программа всегда должна сделать процесс А потому, что я думаю, что if(condition = 0) должен всегда возврат true, поскольку это значение 0 переменной condition, и этот процесс установки должен быть правдой. Тем не менее, программа всегда выполняет процесс B, то есть значение if использует значение переменной condition, и мое предположение неверно.

Тогда я сделал еще один тестовый код:

if(condition = 2) //or other none-zero value 
{ 
    //do process A 
} 
else 
{ 
    // do process B 
} 

на этот раз, программа всегда делает процесс A.

Мой вопрос, почему if-else условие не использовать значение операции условия, но с помощью левой переменная после настройки?

ответ

4

, когда вы назначаете 0 условию переменной, оно становится ложным, так как 0 представляет значение false, а любое ненулевое значение представляет true.so, когда вы назначаете 0 else условие выполняется, и когда вы назначаете условие 2, это означает истинное утверждение, поэтому оно выполняет ...

if(condition = 0)  

после присвоения значения 0 кондиционировать становится

if(condition)  

и как это ложь, это не execute.but, когда условие = 2, он работает в том же путь и стать истинным .so, тогда выполняется условие if.

+0

, но я думаю, что операция присваивания должна возвращать 'true' –

+0

, почему она должна возвращать true? он вернет true для всех значений, кроме только 0. 0. –

+0

Я имею в виду, что операция присваивания успешно выполнена, и при присвоении ошибки нет возврата ошибки –

2

В C назначение - это выражение, которое возвращает заданное значение; т.е. x = 2 приведет 2.

Это позволяет сделать что-то вроде этого:

unsigned char ch; 
while((ch = readFromFile(f)) != EOF) { 
    // do something with ch 
} 

Это также позволяет стрелять себе в ногу, если вы случайно ошиблись при вводе == в =, поэтому это " функция "не отображается на многих других языках.

В вашем первом цикле выражение condition = 0 всегда будет иметь значение 0, в результате чего необходимо принять ветвь else. Аналогичным образом, condition = 2 приводит к 2, что приводит к принятию истинной ветви.

+0

но что такое операция «x = 2',' true' of 'false'? –

+0

@HowChen прочитал первое предложение этого сообщения. Результатом присваивания является переменная, которой была назначена. 'if (x = 0)' то же самое, что и 'x = 0; if (x) ' –

+0

это' 2'. И когда целое число появляется в выражении 'if', то' 0' означает 'false', а что-либо не' 0' означает 'true'! Это важный факт о C. – librik

3

Вы используете неправильный оператор.

a = 10;

Оператор «equals» означает «присваивать значение».

Теперь, чтобы сравнить два операнда, a и b, чтобы увидеть, если a = b, вы используете другой операнд. Этот операнд имеет двойное значение (==).

if(variable == 0) 
{ 
    //do process A 
} 
else 
{ 
    // do process B 
} 

Теперь посмотрите.

Если переменная с именем "variable" имеет значение = 8, которое не равно 0, , таким образом, все выражение "variable == 0", если FALSE. Итак, программа PRO будет работать.

Если в противном случае переменная равно 0, то будет выполняться процесс A, потому что «variable == 0» - true.

Это как:

if(EXPRESSION) 
{ 
    // EXPRESSION IS TRUE 
} 
else 
{ 
    //EXPRESSION IS FALSE 
} 

Понял? :)

+1

Я знаю, как использовать 'if-else', PLS посмотреть мой вопрос, мне нужно знать, почему, если значение условия использования 0, но не использовать результат операции присваивания –

+0

У вас есть выражение в скобках. Это выражение может быть чем-то (a == b) или просто (b). Если теперь назначить (b = 2), это не так, а не false. Это правда. Таким образом, (b = 2) равно просто (b) со значением, отличным от 0. Таким образом, он всегда возвращает true. Надеюсь, это помогло вам. Это 2 действительно отличает ложное значение ... –