我在C中遇到了一个表达式
typeof((c) + 1) _tmp = c;
这究竟是什么意思?
感谢您的回复。
只有一个疑问?如果c的类型是struct而不是基本类型,那么+1会做什么?
答案 0 :(得分:56)
普通C(非C ++)中的typeof
运算符是标准的GCC添加。它告诉编译器你想要使用括号括起来的表达式的类型。
如上所述使用typeof
,您可以使用另一个变量的类型作为参考,声明您或该上下文中未知类型的变量。它也可以用于铸造。
+
内的typeof
操作具有特殊效果。 typeof((c) + 1)
表示“c的类型,或者1的类型,在促销后保留的任何一种”。请记住,例如,当在涉及整数的操作中使用字符时,字符会被提升为整数,整数会被提升为浮点数,浮点数会被提升为双精度数等。
因此,typeof(int_variable + char_variable)
为int
,因为char
会被提升为int
以执行操作。
请注意,只有编译器可以解决这个问题:typeof
没有评估,它没有值,在运行时没有任何反应。
typeof
的完整说明可以是found here。
答案 1 :(得分:5)
创建var _tmp
st _tmp
的类型为c
或int
的upcast(最大值),并将其设置为c
的值。
例如
char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
答案 2 :(得分:4)
它不是标准C. C没有typeof
这样的东西(除非你正在处理用户定义的东西)。
typeof
通常是编译器扩展(最有可能是GCC编译器)。你可以在这里阅读它
答案 3 :(得分:4)
除了另一个答案,这里的+
非常微妙。它允许c
是表达式或类型。
c
被提升为int
(至少)
和整个表达的类型
至少具有整数等级int
。c
的括号使它成为一个
值为+1
的强制转换。那么结果类型只是c
。对于这两种杂技,重要的是c
是算术类型,并且还要注意这里的这个技巧可能会失去c
的签名。因此,typeof
扩展名的使用并不像它看起来那么有用。在大多数情况下,使用uintmax_t
或intmax_t
就足够了。
答案 4 :(得分:4)
比较代码,
typeof((c) + 1) _tmp = c;
带
typeof(c) _tmp = c;
typeof
允许类型或变量的参数。现在将c
视为
struct { int a; int b }
struct { int a; int b }
int
。根据uʍop ǝpısdn 促销 char
,宏可以防止struct
分配。所以下面的代码不会编译,
struct { int a; int b } c;
typeof((c)+1) _tmp = c;
由于效率和代码大小原因,人们可能希望禁止struct
分配,尤其是在通用宏中。
答案 5 :(得分:1)
Typeof返回一个类型,并在编译时进行评估。
整个语句意味着声明一个变量tmp
,其类型与c(通常)相同。
它可能声明一个相关或不同的类型,因为c + 1的类型可能与c不同。 (这在c ++中更有可能)。
答案 6 :(得分:1)
在我看来,只针对指针,typeof((c) + 1) = typeof(c);
所以这可能会保证传递参数是指针