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

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

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

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

Это не ошибка.

Порядок вычисления подвыражений в выражении не определён.

Не нужно на него рассчитывать.

Koldun Zloy #:

Это не ошибка.

Порядок вычисления подвыражений в выражении не определён.

Не нужно на него рассчитывать.

И в каком же еще компиляторе, кроме MQL - вычисления идут справа налево - кроме пустых слов - пример можете привести?

[Удален]
A100 #:

И в каком же еще компиляторе, кроме MQL - вычисления идут справа налево - кроме слов - пример можете привести?

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

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

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

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)


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