Я натолкнулся на выражение в C как
typeof((c) + 1) _tmp = c;
Что именно это означает?
Спасибо за ответ.
Просто одно сомнение? Что, если тип c является структурой вместо примитивных типов, то что будет делать +1?
Я натолкнулся на выражение в C как
typeof((c) + 1) _tmp = c;
Что именно это означает?
Спасибо за ответ.
Просто одно сомнение? Что, если тип c является структурой вместо примитивных типов, то что будет делать +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
может быть найдено здесь.
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
Это не стандарт C. C не имеет такой вещи, как typeof
(если вы не имеете дело с чем-то определенным пользователем).
typeof
обычно является расширением компилятора (скорее всего, компилятор GCC). Вы можете прочитать об этом здесь.
В дополнение к другому ответу, +
здесь довольно тонкий. Он позволяет c
быть выражением или типом.
c
повышается до int
(по крайней мере)
и тип всего выражения
имеет как минимум целочисленный ранг int
.c
, делают
литой значения +1
. Итак, результирующий тип - это просто c
.Для обоих видов акробатики важно, чтобы c
имел арифметический тип, и также следует отметить, что этот трюк может потерять подпись c
. Поэтому использование расширения typeof
не так полезно, как могло бы выглядеть. В большинстве случаев использование uintmax_t
или intmax_t
было бы достаточно.
Сравните код,
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
для целей эффективности и размера кода, особенно с помощью - в общем макросе.
Typeof возвращает тип и вычисляется во время компиляции.
Весь оператор означает объявление переменной tmp
с тем же типом, что и c (обычно).
Он может объявлять родственный или другой тип, так как тип c + 1 может отличаться от c. (это более вероятно в С++).
По-моему, только для указателя typeof((c) + 1) = typeof(c);
, поэтому это может гарантировать, что передающий параметр является указателем