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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

В C/С++ false представляется как 0.

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

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

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

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

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

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

Ответ 3

Ваше логическое значение присваивается целому числу и становится равным 1.

Ответ 4

в C и С++, 0 является ложным и ничего, кроме нуля, верно:

if ( 0 )
{
// never run
}

if ( 1 )
{
// always run
}

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

Когда компилятор вычисляет логическое выражение, он обязан создавать 0 или 1. Кроме того, существует пара удобных typedefs и определяет, что позволяет вам использовать "true" и "false" вместо 1 и 0 в ваших выражениях.

Итак, ваш код выглядит так:

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";
}

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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";
}

Ответ 8

Я бы не ожидал, что этот код будет определен, и вы не должны зависеть от того, какое поведение ваш компилятор вам дает. Вероятно, истина преобразуется в int (1), а a не преобразуется в bool (true), как вы ожидаете. Лучше писать то, что вы имеете в виду (a!= 0), то зависеть от этого (даже если это будет определено).

Ответ 9

что-то отличное от 0 (это ложь) не обязательно true (то есть 1)

Ответ 10

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

Обновление: как сказано в комментарии, мой оригинальный ответ - false. Поэтому обходите его.

Ответ 11

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