LINUX.ORG.RU

История изменений

Исправление 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) это приведение типа. по стандарту тупо отбрасывается десятичная часть ЕМНИП.

Я это и имел в виду. Достаточно много неоднозначных решений, которые сейчас, внезапно, стали «образцом чистоты и простоты».