Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int a,b,c; a=b=0; c = a+++b; printf(«Value a=%d\n», a);
В зависимости от вида компилятора либо a==1, b==0, либо a==0, b==1.
a всегда равно 1. Выражение a+++b трактуется компилятором соответствующим стандарту как (a++) + b. В С99 это описано в пункте стандарта 6.4, в С++98 — в пункте 2.4:3.Undefined behavior – Это самый опасный вариант неопределённости. В Стандарте он служит для описания поведения, которое может привести к полностью непредсказуемым последствиям
как они назывались до C++11, кстати
Вот пример попроще:
foo( bar(), buzz() ); — где не специфицирован порядок вызова bar и buzz. Гарантируется, что оба завершатся до вызова foo.
А чем мой плох?
int c = Div(arr[idx++], arr[idx++]);int c = Div(arr[idx++], arr[idx]);
Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
int i = 0;
i = i++ + ++i;Ситуация, когда код на языке C++ синтаксически валиден, однако его поведение не определено в Стандарте, в русскоязычной литературе часто называют просто неопределённым поведением.
Лучше (точнее, полнее) было бы просто перевести страницу на cppreference
Лучше использовать стандарт
В заключение ещё раз напомню, что все вышеописанные термины относятся к синтаксически валидному коду, который будет успешно скомпилирован. Код, невалидный с точки зрения Стандарта, называется ill-formed program.
Неопределённое поведение в C++