Почему приведенный ниже код возвращает 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 перед компиляцией.