Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2014, 16:31   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Приоритет && и ||

Доброго дня.
Код:
#include <iostream>
using namespace std;

bool f1() {cout << "f1\n"; return true;}
bool f2() {cout << "f2\n"; return false;}
bool f3() {cout << "f3\n"; return false;}
    
struct S
{
    bool operator ||(bool) {cout << "operator ||\n"; return false;}
    bool operator &&(const S&) {cout << "operator &&\n"; return false;}
};
    
int main()
{
    //S s;
    //if(s  ||  s  &&  s) {}
    // cout : operator &&
    // cout : operator ||
    

    if( f1()  ||  f2()  &&  f3() ) {}
    // cout : f1
    
    return 0;
}
Из эксперимента выше, можно сделать вывод о том, что приоритеты упомянутых операторов в разных ситуациях отличаются. Если опираться на справочник http://en.cppreference.com/w/cpp/lan...tor_precedence, то поведение всегда должно быть как в первом случаи.

Ладно, как работает так работает, вопрос только один: закреплено ли стандартом поведение во втором случаи (со стандартными операторами)? Clang, например, ругается.
220Volt вне форума Ответить с цитированием
Старый 23.04.2014, 17:42   #2
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Кажется понял в чем дело.
Код:
#include <iostream>
using namespace std;

struct T
{
    const char *str;
    operator int() {cout << this->str << "\n"; return 2;}
};
    
int main()
{
    T t1{"t1"}, t2{"t2"}, t3{"t3"};
    int res = t1 + t2 * t3;
    cout << res;
    // cout : t1
    // cout : t2
    // cout : t3
    // cout : 6

    return 0;
}
Т.е сначала происходят преобразования в подходящий тип (слева направо), а потом все остальное. Преобразование слева направо, закреплено в стандарте?
220Volt вне форума Ответить с цитированием
Старый 23.04.2014, 18:22   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Преобразование является частью вычисления аргумента в выражении. Порядок вычисления аргументов неопределен. Следовательно, ответ отрицательный )
Вообще, все написано здесь
Son Of Pain вне форума Ответить с цитированием
Старый 23.04.2014, 18:27   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В случае со стандартными && и || - да, так по стандарту (C++11 5.14, 5.15). Там левая часть sequenced before правая часть, причём правая не вычисляется, если левая false/true соответственно.
Somebody вне форума Ответить с цитированием
Старый 23.04.2014, 19:25   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Спасибо, пойду переваривать ссылку.
220Volt вне форума Ответить с цитированием
Старый 24.04.2014, 09:54   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вообще, когда есть сомнения, ставьте скобки...
int a = 2 + (2 * 2);
waleri вне форума Ответить с цитированием
Старый 24.04.2014, 11:09   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вообще, когда есть сомнения, ставьте скобки...
int a = 2 + (2 * 2);
Только лишние скобки не меняют порядка вычислений...
Somebody вне форума Ответить с цитированием
Старый 24.04.2014, 12:57   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вообще, когда есть сомнения, ставьте скобки...
int a = 2 + (2 * 2);
Я немного о другом, например:
Код:
#include <iostream>
using namespace std;

struct T
{
    const char *str;
    operator int() {cout << this->str << "\n"; return 2;}
};
    
int main()
{
    T t1{"t1"}, t2{"t2"}, t3{"t3"};
    int res = t1 + (t2 * t3);             // Добавили скобки, умножение приоритетней
    cout << res;
    // cout : t1                     // ВНИМАНИЕ !!
    // cout : t2                     // ВНИМАНИЕ !!
    // cout : t3                     // ВНИМАНИЕ !!
    // cout : 6

    return 0;
}
220Volt вне форума Ответить с цитированием
Старый 24.04.2014, 13:11   #9
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Вырезка из справочника по ссылке выше, раскрывает суть вопроса:
Код:
Order of evaluation of the operands of any C++ operator, including the order of
evaluation of function arguments in a function-call expression, and the order of
evaluation of the subexpressions within any expression is unspecified (except where
noted below). The compiler will evaluate them in any order, and may choose another
order when the same expression is evaluated again.

There is no concept of left-to-right or right-to-left evaluation in C++, which is not to be
confused with left-to-right and right-to-left associativity of operators: the expression
f1() + f2() + f3() is parsed as (f1() + f2()) + f3() due to left-to-right associativity of
operator+, but the function call to f3 may be evaluated first, last, or between f1() or f2()
at run time.
220Volt вне форума Ответить с цитированием
Старый 12.05.2014, 17:53   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Выходит следующий код содержит ошибку?
Код:
if( ptr  &&  ptr->f() )   {}
Надо переписывать:
Код:
if(ptr)
    if( ptr->f() )   {}
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не перегружается ostream& operator<<(ostream &, Card&) Antej Общие вопросы C/C++ 2 17.12.2012 14:02
Вопрос по поводу меню на сайте, html&css&js antoxa22 HTML и CSS 14 30.12.2011 11:02
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Просто не понимаю б чём проблема!!!!!!!(char* && index) artush1984 Общие вопросы C/C++ 12 30.05.2009 03:30