невозможно понять вывод первого кода при сравнении 3 аргументов в операторе if - PullRequest
1 голос
/ 11 августа 2011

это небольшой код, который сравнивает 3 переменные сразу.Я сравнил 2 кода.

FIRST

#include <iostream>

int main() {
if( 8 > 7 > 6) std::cout << "true";
else std::cout << "false";
std::cout << "\n";
std::cout << (8 < 9); 
std::cout << "\n";
system("pause");
}
// output :
/* false
 * 1
 */

SECOND

#include <iostream>

int main() {
if( 8 > (7 > 6) ) std::cout << "true"; // with brackets
else std::cout << "false";
std::cout << "\n";
std::cout << (8 < 9); 
std::cout << "\n";
system("pause");
}
// output :
// true
// 1

Я понимаювторой вывод, но не могу понять, как вычисляется оператор if в первом коде? Пожалуйста, объясните.

Ответы [ 8 ]

7 голосов
/ 11 августа 2011

Реляционные операторы слева направо, поэтому 8>7>6 оценивается как (8>7)>6. 8>7 оценивается в true, что преобразуется в 1, поэтому вы получаете 1>6, чтоis false.

Стандарт C ++ фактически упоминает эту точку явно:

Группа реляционных операторов слева направо. [Пример: a

3 голосов
/ 11 августа 2011

if( 8 > 7 > 6) означает if( (8 > 7) > 6), что означает if( (1) > 6), что означает if(false). Это означает, что блок if не может быть выполнен, будет выполнен блок else, который печатает false.

if( 8 > (7 > 6)) означает if( ( 8 > (1) ), что означает if(true). Таким образом, выполняется блок if, который печатает true.

А значение (8<9) легко узнать, если вы знаете, что означает <. Ну, (8<9) возвращает true, что означает 1.

2 голосов
/ 11 августа 2011

Класс if выполняется классически для сравнения 2 операторов. Если вы хотите сравнить более 2 операторов, вам следует использовать логическое ИЛИ || или логическое И &&.Причиной этого является логическая логика.Выражение, которое вы разместили в первой программе, оценивает слева направо, что означает

if (8 >7)>6

Если 8 больше 7 (что оно есть), оно будет оцениваться как true, что равно «1» в булевой логике (1 - истина, 0 - ложь).Таким образом, после этой оценки у вас есть:

if (1 > 6)

, что естественно оценивается как ложное.Поскольку сравнение больше не 8/7/6, оно истинно / 6. И в этом случае true меньше 6, а значит, и false.

Если бы вы настроили его таким образом, было быожидаемые результаты:

if (8 > 7 && 7 > 6)//Do stuff

или, наоборот, если вы хотите быть исчерпывающим ..

if (8 > 7 && 7 > 6 && 8 > 6)

, чтобы все числа сравнивались (это было бы более разумно, если выимел 3 переменные, возможно, где x должен быть равен 100, y должен быть равен 50, а z должен быть равен 25.)

Тогда вы получите сравнение

if (x > y && y > z && x > y) //do stuff

Это будет иметь значение true в том случае, если ваши переменные имели ожидаемое содержимое.

2 голосов
/ 11 августа 2011

Первый оператор if кода вычисляется в порядке слева направо.то есть: (8 > 7) > 6, который оценивается следующим образом:

(8 > 7) > 6
(1) > 6
0

Обратите внимание, что (8 > 7) равно true, поэтому он возвращает числовой эквивалент true, 1.

Общая оценка составляет 0, т.е.false.

0 голосов
/ 11 августа 2011

Ассоциативность оператора ">" слева направо, так что это означает, что в вашем первом примере сначала вычисляется "8> 7", а результат равен 1, который затем сравнивается с 6, что результат неверен

Во втором примере, поскольку вы используете скобки, мы имеем 8> 1, что верно.

Надеюсь, это поможет.

0 голосов
/ 11 августа 2011

Реляционные операторы ассоциируются слева направо!8> 7> 6 = (8> 7)> 6 = 1> 6 = FALSE

0 голосов
/ 11 августа 2011

Оператор if вычисляется слева направо, поэтому он равен (8> 7)> 6.

8> 7 - истина, равная 1, поэтому он оценивает 1> 6, чтоложь.

0 голосов
/ 11 августа 2011

если (8> 7> 6) оценивается как:

if((8 > 7) > 6)
if(true > 6)
true is implicitly casted to 1. 
1 > 6 is false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...