Ошибки, баги, вопросы - страница 3474

 
Koldun Zloy #:

В любом компиляторе C++.

И не справа налево, а как захочется компилятору.

В стандарте языка это не определено.

Конкретно в каком С++ компиляторе у вас получился результат этого примера   2-1-3 ?

 
A100 #:

Конкретно в каком С++ компиляторе у вас получился результат этого примера   2-1-3 ?

Даже проверять не буду.

Какая разница в каком компиляторе в данный момент получится такой результат?

Это может измениться в любой момент при очередном обновлении или по другим неизвестным причинам.

Если стандартом это не определено, значит ни на какой порядок полагаться нельзя.

 
Koldun Zloy #:

Даже проверять не буду.

Какая разница в каком компиляторе в данный момент получится такой результат?

Это может измениться в любой момент при очередном обновлении или по другим неизвестным причинам.

Если стандартом это не определено, значит ни на какой порядок полагаться нельзя.

Конечно не будете - потому что в любом нормальном компиляторе результат будет 1-2-3

Разберитесь сначала в вопросе, а потом уже комментируйте

 
A100 #:

Конечно не будете - потому что в любом нормальном компиляторе результат будет 1-2-3

Разберитесь сначала в вопросе, а потом уже комментируйте

А Вы видимо разобрались? Тогда приведите ссылку на стандарт.

Бессмысленность проверки в компиляторе я уже обосновал.

 
Koldun Zloy #:

А Вы видимо разобрались? Тогда приведите ссылку на стандарт.

Бессмысленность проверки в компиляторе я уже обосновал.

Вот информация из справочника Microsoft

Приоритет оператора C++ и таблица ассоциативности

Приоритет группы 13, слева направо ассоциативность
Логическое И && and


т.е. порядок не произвольный, а строго регламентирован Таблицей ассоциативности, и там не у всех операторов она слева направо, например у &= наоборот справа-налево

 
A100 #:

Вот информация из справочника Microsoft

Приоритет оператора C++ и таблица ассоциативности

Приоритет группы 13, слева направо ассоциативность
Логическое И && and


т.е. порядок не произвольный, а строго регламентирован Таблицей ассоциативности, и там не у всех операторов она слева направо, например у &= наоборот справа-налево

Это порядок вычисления всего выражения, а не его подвыражений.

Почитайте здесь.

 
A100 #:
Ошибка при выполнении:

Результат:   2-1-3

Ожидалось: 1-2-3

Если отказаться от операторов в пользу методов, то будет понятнее причина.

class A {
public:
    A() {}
    A(const A&) {}
    void g(const A&) { Print(3); }
};
A f( int i ) { Print( i ); return A(); }
void OnStart()
{
    f(1).g(f(2));
}

Что в этом выражении вычислять первым?


struct A { int i; void f( int ) { Print(__FUNCSIG__); } };

A g() { Print(__FUNCSIG__); A a; return(a); }

int Rand() { Print(__FUNCSIG__); return(0); }

void OnStart()
{
  g().f(Rand());
}


Результат.

int Rand()
A g()
void A::f(int)


Т.е. сначала вычисляется входной параметр, а затем - все остальное.

 
Koldun Zloy #:

Это порядок вычисления всего выражения, а не его подвыражений.

Почитайте здесь.

пункт 6

Every value computation and side effect of the first (left) argument of the built-in logical AND operator &&, the built-in logical OR operator || and the built-in comma operator , is sequenced before every value computation and side effect of the second (right) argument.

Другими словами слева-направо

 
Koldun Zloy #:

В любом компиляторе C++.

И не справа налево, а как захочется компилятору.

В стандарте языка это не определено.

Здесь на вызов оператора bool(const A&,const A&), а вызов метода void A::operator &&(const A&). Поэтому, вроде как да, это баг компилятора.

Но, есть одно но, из великого и могучего: https://en.cppreference.com/w/cpp/language/eval_order

Так вот. Я несколько раз перечитал, тема реально мутнейшая, и не нашел в стандарте указания, что . порождает sequence point.

Поэтому, если я все правильно понимаю (тут я не уверен на 100%, если есть спецы по теме, поправьте, но только с ссылками на стандарт), то при вызове f(1).operator &&(f(2)), компилятор реально имеет право вызвать f(1) и f(2) в любом порядке.

 
fxsaber #:

Если отказаться от операторов в пользу методов, то будет понятнее причина.

У каждой ошибки есть какая то причина

Причина обращения: