c中的((c)和#x2B;1)类型是什么
我遇到了一个类似C的表达式c中的((c)和#x2B;1)类型是什么,c,gcc,C,Gcc,我遇到了一个类似C的表达式 typeof((c) + 1) _tmp = c; 这到底意味着什么 谢谢你的回复 只有一个疑问?如果c的类型是struct而不是primitive类型,那么+1会做什么呢?它不是标准的c。c没有typeof(除非您处理的是用户定义的东西) typeof通常是一个编译器扩展(最有可能是GCC编译器)。你可以在这里读到 创建var\u tmpst\u tmp的类型为上溯(最大值)为c或int,并将其设置为c的值 乙二醇 普通C(不是C++)中的typeof运算符是对标
typeof((c) + 1) _tmp = c;
这到底意味着什么
谢谢你的回复
只有一个疑问?如果c的类型是struct而不是primitive类型,那么+1会做什么呢?它不是标准的c。c没有
typeof
(除非您处理的是用户定义的东西)
typeof
通常是一个编译器扩展(最有可能是GCC编译器)。你可以在这里读到
创建var
\u tmp
st\u tmp
的类型为上溯(最大值)为c
或int
,并将其设置为c
的值
乙二醇
普通C(不是C++)中的
typeof
运算符是对标准的GCC补充。它告诉编译器您要使用括号中包含的表达式类型
如上所述,使用typeof
,您可以声明未知类型的变量,或者在该上下文中,使用另一个变量的类型作为引用。它也可用于铸造
+
中的
操作具有特殊的效果<代码>类型((c)+1)表示“c类型或类型1,以升级后保留的为准”。请记住,例如,在涉及整数的操作中使用字符时,会将字符提升为整数,整数将提升为浮点,浮点将提升为双精度,等等
因此,typeof(int\u variable+char\u variable)
是int
,因为char
将被提升到int
来执行操作
请注意,只有编译器才能解决此问题:typeof
不求值,它没有值,在运行时不会发生任何事情
typeof的完整描述可以是。typeof返回一个类型,并在编译时进行计算
整个语句意味着声明一个与c(通常)类型相同的变量tmp
它可能声明一个相关的或不同的类型,因为c+1的类型可能不同于c。(这在c++中更可能。)除了另一个答案,这里的+
非常微妙。它允许c
作为表达式或类型
- 如果它是一个表达式,那么,正如前面所说,
c
升级为int
(至少)
以及整个表达式的类型
至少具有整数秩int
- 如果它是一个类型表达式
用括号括住c,使其成为
值的类型转换
+1
。因此,结果类型就是c
对于这两种杂技,重要的是c
是算术类型,还需要注意的是,这里的这个技巧可能会失去c
的符号性。因此,使用typeof
扩展并不像看上去那样有用。在大多数情况下,使用uintmax\u t
或intmax\u t
就足够了。比较代码
typeof((c) + 1) _tmp = c;
与
typeof
允许类型或变量的参数。现在考虑<代码> C <代码> AS,
struct{inta;intb}
- 指向
struct{inta;intb}
- 实际文本
int
除了根据提升char
之外,宏还可以防止struct
赋值。所以下面的代码不会编译
struct { int a; int b } c;
typeof((c)+1) _tmp = c;
出于效率和代码大小的原因,人们可能希望禁止struct
赋值,尤其是在通用宏中。在我看来,只有指针,typeof((c)+1)=typeof(c)代码>所以这可以确保传递的参数是指针那么+1会做什么?我理解typeof的用法,但不理解typeof中+1的含义do@zom强制tmp变为int如果c
较小,那么int+1
在哪里起作用?@Stilgar这是由于整数提升吗?简言之:是,这是由于整数提升。这并不能解释什么是+1
doing@SiegeX:这也没有解释=
在做什么以及在做什么代码>正在执行。当被问到“它在做什么?”这样一个宽泛的问题时,由做出答案的人决定说什么和不说什么。我认为以上已经足够了。祝贺你的决定。然而,我和许多其他人(看看其他答案上的其他评论)认为对+1
所做的解释是合理的,因为它在类型的范围内是不直观的@Santiago Lezica:1的类型是什么?对不起,我没有收到that@user*嗯,假设您在代码中编写1
时,编译器假定这是一个值为1的整数。1
的类型是int
@Santiago Lezica:所以它是特定于编译器的类型是什么?@user*好吧,你可以放心地打赌它在任何地方都是int
,但是正如我所说的,typeof
是GNU C编译器(GCC)的一个特性,它在C中不是标准的。如果C的类型是一个结构,那么+1会做什么呢?即使在C中,如果C
是char
或short
并且int
更大,那么表达式C+1
的类型也会增加int
。如果c
是较大的整数类型,或者是float
或double
,则表达式的类型为c
类型。它不需要C++来对类型产生混淆…如果C的类型是结构,那么+1会做什么??真的很好的问题!我学到了一些新东西today@SiegeX-可能是#定义宏(…,c…)
typeof(c) _tmp = c;
struct { int a; int b } c;
typeof((c)+1) _tmp = c;