Я натолкнулся на выражение в 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);, поэтому это может гарантировать, что передающий параметр является указателем