Исправление monk, (текущая версия) :
так (int) это приведение типа. по стандарту тупо отбрасывается десятичная часть ЕМНИП.
Я это и имел в виду. Достаточно много неоднозначных решений, которые сейчас, внезапно, стали «образцом чистоты и простоты»: формат описания типа, присваивание как выражение (то есть его можно вставлять в любое место выражения), формат строки, правила алиасинга…
Да и текст C89… Вот, например, исходя из
C89, §3.3 EXPRESSIONS
An object shall have its stored value accessed only by an lvalue that has one of the following types:
- the declared type of the object,
- a qualified version of the declared type of the object,
- a type that is the signed or unsigned type corresponding to the
declared type of the object,
- a type that is the signed or unsigned type corresponding to a
qualified version of the declared type of the object,
- an aggregate or union type that includes one of the aforementioned
types among its members (including, recursively, a member of a
subaggregate or contained union), or
- a character type
Из этого параграфа получаем, что
void test(void)
{
struct S {int x;} s;
s.x = 1;
}
должен содержать UB. Ведь int lvalue не относится ни к одному из шести перечисленных допустимых вариантов изменения значения типа S.
Исходная версия monk, :
так (int) это приведение типа. по стандарту тупо отбрасывается десятичная часть ЕМНИП.
Я это и имел в виду. Достаточно много неоднозначных решений, которые сейчас, внезапно, стали «образцом чистоты и простоты».