Почему приведенный ниже код возвращает true только для a = 1?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
Почему приведенный ниже код возвращает true только для a = 1?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
Когда Bool true преобразуется в int, он всегда преобразуется в 1. Таким образом, ваш код эквивалентен:
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
Это часть С++ standard, поэтому вы бы ожидали, что это произойдет с каждым компилятором, совместимым с стандартами на С++.
Причина, по которой ваш оператор печати не выполняется, заключается в том, что ваш логический код становится неявным образом преобразован в число, а не наоборот. То есть ваш оператор 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";
}
Ваше логическое значение присваивается целому числу и становится равным 1.
в 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";
}
Поскольку true равен 1. Если вы хотите проверить a для ненулевого значения, просто напишите if (a).
Я предлагаю вам переключиться на компилятор, который предупреждает вас об этом... (VС++ дает следующее: предупреждение C4806: '==': небезопасная операция: никакое значение типа 'bool', способствуемое типу 'int', не может равняться данной константе; У меня нет другого компилятора.)
Я согласен с Лу Франко - вы хотите узнать, больше ли эта переменная больше нуля (или не соответствует ей), проверьте это.
Все, что сделано неявным образом компилятором, опасно, если вы не знаете последней детали.
Вот как большинство людей пишут такой код:
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";
}
Я бы не ожидал, что этот код будет определен, и вы не должны зависеть от того, какое поведение ваш компилятор вам дает. Вероятно, истина преобразуется в int (1), а a не преобразуется в bool (true), как вы ожидаете. Лучше писать то, что вы имеете в виду (a!= 0), то зависеть от этого (даже если это будет определено).
что-то отличное от 0 (это ложь) не обязательно true (то есть 1)
Поскольку логическое значение является битом в C/С++, а true представлено 1, false - 0.
Обновление: как сказано в комментарии, мой оригинальный ответ - false. Поэтому обходите его.
Поскольку true равен 1. Он определен в директиве pre-proccesor, поэтому весь код с истинным в нем включен в 1 перед компиляцией.