Подтвердить что ты не робот

Что есть типof ((c) + 1) в C

Я натолкнулся на выражение в C как

typeof((c) + 1) _tmp = c;

Что именно это означает?

Спасибо за ответ.

Просто одно сомнение? Что, если тип c является структурой вместо примитивных типов, то что будет делать +1?

4b9b3361

Ответ 1

Оператор typeof в простой C (не С++) является дополнением GCC к стандарту. Он сообщает компилятору, что вы хотите использовать тип выражения, заключенного в круглые скобки.

Используя typeof, как указано выше, вы можете объявлять переменные неизвестных типов или в этом контексте, используя другой тип переменной в качестве ссылки. Он также может использоваться для кастинга.

Операция + внутри typeof имеет своеобразный эффект. typeof((c) + 1) означает "тип c, или тип 1, в зависимости от того, что останется после продвижения по службе". Помните, что, например, символы присваиваются ints при использовании в операциях с использованием ints, ints повышается до float, плавает до удваивается и т.д.

Итак, typeof(int_variable + char_variable) - int, так как для int для будет <<27 > int.

Обратите внимание, что только компилятор может решить эту проблему: typeof не оценивает, он не имеет значения, ничего не происходит во время выполнения.

Полное описание typeof может быть найдено здесь.

Ответ 2

create var _tmp st _tmp имеет тип upcast (max) c или int и устанавливает его значение c.

eg

char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float

Ответ 3

Это не стандарт C. C не имеет такой вещи, как typeof (если вы не имеете дело с чем-то определенным пользователем).

typeof обычно является расширением компилятора (скорее всего, компилятор GCC). Вы можете прочитать об этом здесь.

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

Ответ 4

В дополнение к другому ответу, + здесь довольно тонкий. Он позволяет c быть выражением или типом.

  • Если это выражение, то, как сказано, c повышается до int (по крайней мере) и тип всего выражения имеет как минимум целочисленный ранг int.
  • Если это выражение типа, круглые скобки, окружающие c, делают литой значения +1. Итак, результирующий тип - это просто c.

Для обоих видов акробатики важно, чтобы c имел арифметический тип, и также следует отметить, что этот трюк может потерять подпись c. Поэтому использование расширения typeof не так полезно, как могло бы выглядеть. В большинстве случаев использование uintmax_t или intmax_t было бы достаточно.

Ответ 5

Сравните код,

typeof((c) + 1) _tmp = c;

с

typeof(c) _tmp = c;

typeof допускает аргументы типов или переменных. Теперь рассмотрим c as,

  • struct { int a; int b }
  • указатель на struct { int a; int b }
  • фактический текст int.

Помимо продвижения char по uʍop ǝpısdn макрос защищает от присваивания struct. Поэтому следующий код не будет компилироваться,

struct { int a; int b } c;
typeof((c)+1) _tmp = c;

Люди могут пожелать запретить назначения struct для целей эффективности и размера кода, особенно с помощью - в общем макросе.

Ответ 6

Typeof возвращает тип и вычисляется во время компиляции.

Весь оператор означает объявление переменной tmp с тем же типом, что и c (обычно).

Он может объявлять родственный или другой тип, так как тип c + 1 может отличаться от c. (это более вероятно в С++).

Ответ 7

По-моему, только для указателя typeof((c) + 1) = typeof(c);, поэтому это может гарантировать, что передающий параметр является указателем