Почему приведенный ниже код возвращает true только для a = 1? - PullRequest
13 голосов
/ 29 сентября 2008

Почему приведенный ниже код возвращает true только для a = 1?

main(){
int a = 10;
if (true == a)
     cout<<"Why am I not getting executed";
}

Ответы [ 11 ]

37 голосов
/ 29 сентября 2008

Когда значение Bool true преобразуется в int, оно всегда преобразуется в 1. Таким образом, ваш код эквивалентен:

main(){
   int a = 10;
   if (1 == a)
      cout<<"y i am not getting executed";
   }

Это часть стандарта C ++ , поэтому вы ожидаете, что это случится с каждым компилятором, совместимым со стандартами C ++.

26 голосов
/ 29 сентября 2008

Причина, по которой ваш оператор print не выполняется, состоит в том, что ваш логический тип неявно преобразуется в число, а не наоборот. То есть Ваше утверждение if эквивалентно этому: if (1 == a)

Вы можете обойти это, сначала явно преобразовав его в логическое значение:

main(){
int a = 10;
if (((bool)a) == true)
     cout<<"I am definitely getting executed";
}

В C / C ++ значение false представлено как 0.

Все остальное представлено как ненулевое. Это иногда 1, иногда что-нибудь еще. Поэтому вы никогда не должны проверять на равенство (==) с чем-то, что является правдой.

Вместо этого вы должны проверить на равенство чему-то, что является ложным. Так как false имеет только 1 допустимое значение.

Здесь мы тестируем все не ложные значения, подойдет любое из них:

main(){
int a = 10;
if (a)
     cout<<"I am definitely getting executed";
}

И третий пример только для того, чтобы доказать, что безопасно сравнивать любое целое число, которое считается ложным, с ложным (равным только 0):

main(){
int a = 0;
if (0 == false)
     cout<<"I am definitely getting executed";
}
5 голосов
/ 29 сентября 2008

Ваш логический тип переводится в целое число и становится 1.

3 голосов
/ 29 сентября 2008

в C и C ++, 0 - ложь, а все, кроме нуля - истина:

if ( 0 )
{
// never run
}

if ( 1 )
{
// always run
}

if ( var1 == 1 )
{
// run when var1 is "1"
}

Когда компилятор вычисляет логическое выражение, он обязан выдавать 0 или 1. Кроме того, есть пара удобных определений и определений типов, которые позволяют вам использовать «true» и «false» вместо 1 и 0 в выражениях. 1004 *

Итак, ваш код на самом деле выглядит так:

main(){
int a = 10;
if (1 == a)
     cout<<"y i am not getting executed";
}

Вы, вероятно, хотите:

main(){
int a = 10;
if (true == (bool)a)
     cout<<"if you want to explicitly use true/false";
}

или просто:

main(){
int a = 10;
if ( a )
     cout<<"usual C++ style";
}
2 голосов
/ 29 сентября 2008

Поскольку true равно 1. Если вы хотите проверить ненулевое значение, просто напишите if (a).

1 голос
/ 29 сентября 2008

Я предлагаю вам переключиться на компилятор, который предупреждает вас об этом ... (VC ++ дает следующее: предупреждение C4806: '==': небезопасная операция: никакое значение типа 'bool', переведенное в тип 'int', не может равняться данной константе; У меня под рукой нет другого компилятора.)

Я согласен с Лу Франко - вы хотите знать, является ли переменная больше нуля (или не равна ей), проверьте это.

Все, что неявно делается компилятором, опасно, если вы не знаете последнюю деталь.

0 голосов
/ 29 сентября 2008

Вот как большинство людей пишут такой код:

main(){
int a = 10;
if (a) // all non-zero satisfy 'truth'
     cout<<"y i am not getting executed";
}

Я также видел:

main(){
int a = 10;
if (!!a == true) // ! result is guaranteed to be == true or == false
     cout<<"y i am not getting executed";
}
0 голосов
/ 29 сентября 2008

Поскольку true равно 1. Он определен в директиве pre-proccesor, поэтому весь код с true в нем превращается в 1 перед компиляцией.

0 голосов
/ 29 сентября 2008

Поскольку булево значение является битом в C / C ++, и значение true представлено 1, значение false - 0.

Обновление: как сказано в комментарии, мой оригинальный ответ неверен. Так что обойди это.

0 голосов
/ 29 сентября 2008

что-то отличное от 0 (то есть false) не обязательно верно (то есть 1)

...