Информация об изменениях

Сообщение Re[15]: Когда это наконец станет defined behavior? от 28.04.2023 20:04

Изменено 28.04.2023 20:09 rg45

Re[15]: Когда это наконец станет defined behavior?
Здравствуйте, T4r4sB, Вы писали:


TB>>>Потому что от желания оптимизатора может поменяться результат функции


σ>>Как-то мало для UB


TB>Лол это и называется уб


Я думаю, тебе не помешало бы разобраться с такими понятиями как undefined behavior, unspecified behavior и implementation defined behavior. Можно почитать здесь: https://en.cppreference.com/w/cpp/language/ub. По иронии судьбы первые два пункта имеют одинаковую аббревиатуру (UB), но при этом очень разный смысл.

Вдобавок в параграфе с описанием unspecified behavior есть еще очень полезная ссылка — Order of evaluation, имеющая непосредственное отношение к обсуждаемому вопросу:

There is no concept of left-to-right or right-to-left evaluation in C++. This is not to be confused with left-to-right and right-to-left associativity of operators: the expression a() + b() + c() is parsed as (a() + b()) + c() due to left-to-right associativity of operator+, but c() may be evaluated first, last, or between a() or b() at run time


То есть, порядок выполнения операций (ассоциативность) и порядок вычисления операндов — это две разные и независимые вещи. Тогда как ассоциативность операторов зафиксирована в стантарте, то порядок вычисления операндов полностью отдан на откуп разработчикам компилятора и относится к UNSPECIFIED behavior. И это совсем не то же самое, что UNDEFINED behavior.
Re[15]: Когда это наконец станет defined behavior?
Здравствуйте, T4r4sB, Вы писали:


TB>>>Потому что от желания оптимизатора может поменяться результат функции


σ>>Как-то мало для UB


TB>Лол это и называется уб


Я думаю, тебе не помешало бы разобраться с такими понятиями как undefined behavior, unspecified behavior и implementation defined behavior. По иронии судьбы первые два пункта имеют одинаковую аббревиатуру (UB), но при этом очень разный смысл. Можно почитать здесь: https://en.cppreference.com/w/cpp/language/ub.

Вдобавок в параграфе с описанием unspecified behavior есть еще очень полезная ссылка — Order of evaluation, имеющая непосредственное отношение к обсуждаемому вопросу:

There is no concept of left-to-right or right-to-left evaluation in C++. This is not to be confused with left-to-right and right-to-left associativity of operators: the expression a() + b() + c() is parsed as (a() + b()) + c() due to left-to-right associativity of operator+, but c() may be evaluated first, last, or between a() or b() at run time


То есть, порядок выполнения операций (ассоциативность) и порядок вычисления операндов — это две разные и независимые вещи. Тогда как ассоциативность операторов зафиксирована в стантарте, то порядок вычисления операндов полностью отдан на откуп разработчикам компилятора и относится к UNSPECIFIED behavior. И это совсем не то же самое, что UNDEFINED behavior.