Является ли (4 › y › 1) допустимым выражением в C++? Как вы это оцениваете, если да?

Это верное выражение? Если да, то можете ли вы переписать его так, чтобы он имел больше смысла? Например, это то же самое, что и (4 > y && y > 1)? Как вы оцениваете связанные логические операторы?


person trusktr    schedule 17.01.2012    source источник


Ответы (5)


Оператор (4 > y > 1) анализируется следующим образом:

((4 > y) > 1)

Операторы сравнения < и > оценивают слева направо.

4 > y возвращает либо 0, либо 1 в зависимости от того, верно оно или нет.

Затем результат сравнивается с 1.

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


Есть одно исключение:

Если y — это класс, а оператор > был перегружен, чтобы делать что-то необычное. Тогда все пойдет.

Например, это не скомпилируется:

class mytype{
};

mytype operator>(int x,const mytype &y){
    return mytype();
}

int main(){

    mytype y;

    cout << (4 > y > 1) << endl;

    return 0;
}
person Mysticial    schedule 17.01.2012
comment
Технически 4 > y возвращает либо false, либо true, которые преобразуются в 0 или 1 для следующего сравнения. - person fredoverflow; 17.01.2012
comment
Я бы обозначил синтаксический анализ как operator>(operator>(4, y), 1), чтобы подчеркнуть тот факт, что это повторное применение бинарных функций, а не какой-то n-арной функции. - person Caleth; 05.11.2018
comment
С++ нужны более сильные типы. Неявное преобразование типов приводит к таким тонким ошибкам. - person Vasantha Ganesh; 15.03.2021

Действительность выражения

Да, это правильное выражение, если предположить, что y является целым числом или может быть неявно преобразовано в него. Если это не так и оператор > перегружен, это другая история, выходящая за рамки этого вопроса.

Он будет оцениваться слева направо как ((4 > y) > 1).

Предполагая, что y является целым числом, давайте рассмотрим две возможности. 4 > y может вернуть true или false. Следующая часть фактически становится true > 1 или false > 1.

Учитывая неявное преобразование bool в int, есть две возможности: A) 4 > y возвращает true. true оценивается как 1. 1 > 1 оценивается как false. Б) 4 > y возвращает false. false равно 0. 0 > 1 оценивается как false.

В любом случае выражение будет оцениваться как ложное.

Переписанная интерпретация

Я предполагаю, что вы имеете в виду ((4 > y) && (y > 1)).

Пример

(4 > y > 1) не то же самое, что (4 > y && y > 1).

Логические операторы

Логические операторы (!, &&, ||) используют логику короткого замыкания.

Учитывая a && b, будет оцениваться a. Если a оценивается как true, то b будет оцениваться. В противном случае b не будет оцениваться. Что касается a || b, логика короткого замыкания работает в обратном порядке. a будет оцениваться. Поскольку выражение a оценивается первым, если оно ложно, нет возможности, чтобы все выражение было оценено как истинное.

Учитывая a || b, будет оцениваться a. Если a оценивается как false, то будет оцениваться b. В противном случае b не будет оцениваться. Поскольку выражение a оценивается первым, если оно истинно, нет возможности, что все выражение будет оцениваться как ложное.

Цепочка операторов зависит от приоритета оператора. Лучше использовать круглые скобки и быть ясным, чем рисковать неправильным поведением.

person Sion Sheevok    schedule 17.01.2012

Я думаю, что это допустимое выражение (не утверждение), но, вероятно, оно не делает того, что вы хотите. Он оценивается слева направо, как (4 > y) > 1. Тест 4 > y будет оцениваться как 0 (ложь) или 1 (истина), и все выражение всегда будет оцениваться как 0 (ложь).

person Ted Hopp    schedule 17.01.2012

4 > y будет оцениваться как логическое значение true или false. Тогда оставшаяся часть выражения будет по существу [true|false] > 1, что не имеет смысла.

person user321605    schedule 17.01.2012
comment
Это имеет смысл, когда вы понимаете, что true и false являются целыми значениями в C/C++. - person Ted Hopp; 17.01.2012
comment
Тед: Нет, это не так. Однако их можно преобразовать в и из. - person GManNickG; 17.01.2012
comment
@Gman: формальность, но актуальная. Семантика может быть жестокой. - person Sion Sheevok; 17.01.2012

4 > y > 1 --> МОЖЕТ БЫТЬ В ЛЮБОМ СЛУЧАЕ, если y - класс!!.

 #include <iostream>
 #include <string>

 struct num{ int n; };

 struct op{ bool v; struct num n; };

 struct op  operator > (int x, num n){
  struct op o = { x > n.n, n };
  return o;
 }
 bool operator > (struct op o, int x)
{
    return o.v && o.n.n > x;
}

int main()
{


    struct num y = { 2 } ;
    if (  4 > y > 1 ) {  std::cout << "4 > y > 1 TRUE" << std::endl; }
    else { std::cout << "4 > y > 1  ALWAYS FALSE" << std::endl; }
}
person Khurshid Normuradov    schedule 25.01.2018