C中typeof((c)+ 1)是什么?
我遇到了C中的一个expression式
typeof((c) + 1) _tmp = c;
这到底是什么意思?
谢谢回复。
只有一个疑问? 如果c的types是结构而不是原始types,那么会怎么样呢?
普通C(而不是C ++)中的typeof
运算符是标准的GCC附加。 它告诉编译器你要使用圆括号中的expression式的types。
如上所述使用typeof
,可以使用另一个variables的types作为引用来声明您或者该上下文中未知types的variables。 它也可以用于铸造。
typeof
的+
操作具有特殊的效果。 typeof((c) + 1)
意思是“c的types或1的types,以升级之后的剩余者为准” 。 请记住,例如,当在涉及整数的操作中使用字符时,字符被提升为整数,整数被提升为浮动,浮动到双倍等。
所以, typeof(int_variable + char_variable)
是int
,因为char
会被提升到int
来执行操作。
请注意,只有编译器才能解决这个问题: typeof
不计算,没有值,运行时没有任何反应。
typeof
的完整描述可以在这里find 。
创buildvar _tmp
st _tmp
types为_tmp
(max)的c
或者int
,并将其设置为c
值。
例如
char c -> int _tmp // char(c) + 1 is int float c -> float _tmp // float(c) + 1 is float
这不是标准C. C没有types的东西(除非你正在处理用户定义的东西)。
typeof
通常是一个编译器扩展(最有可能的是GCC编译器)。 你可以在这里读到它
除了另一个答案,这里的+
很微妙。 它允许c
是一个expression式或一个types。
- 如果它是一个expression式,那么,如上所述,
c
被提升为int
(至less),并且整个expression式的types至less具有int
整数级别。 - 如果它是一个typesexpression式,围绕
c
的圆括号使其成为+1
值。 那么最终的types就是c
。
对于这两种杂技来说,重要的是c
是算术types的,也要注意这里的这个技巧可能会失去c
的符号性。 所以这种扩展types的使用并不像看起来那么有用。 在大多数情况下,使用uintmax_t
或intmax_t
就足够了。
比较代码,
typeof((c) + 1) _tmp = c;
同
typeof(c) _tmp = c;
typeof
允许types或variables的参数。 现在考虑一下c
,
-
struct { int a; int b }
- 指向
struct { int a; int b }
struct { int a; int b }
- 实际的文字
int
。
以及根据uʍopǝpısdn 提升 char
,macros可以防止struct
赋值。 所以下面的代码不会编译,
struct { int a; int b } c; typeof((c)+1) _tmp = c;
为了效率和代码大小的原因,人们可能希望禁止struct
分配,特别是在通用的macros中。
Typeof返回一个types,并在编译时进行评估。
整个语句意味着声明与c(通常)相同types的variablestmp
。
它可能会声明一个相关或不同的types,因为c + 1的types可能与c不同。 (这在c ++中更可能)。
在我看来,只用于指针, typeof((c) + 1) = typeof(c);
所以这可能会保证传递参数是指针