Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的((c)和#x2B;1)类型是什么_C_Gcc - Fatal编程技术网

c中的((c)和#x2B;1)类型是什么

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运算符是对标

我遇到了一个类似C的表达式

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;