12

当我问他是什么时 ,这个问题的作者只是取笑我sizeof * q......他告诉我这是一个非常基本的 C 问题,我应该检查一下。但是当我环顾四周并且以前没有看到有人问过时,我现在自己做:

sizeof在没有括号和/或类型的情况下使用 C 时会做什么?

4

5 回答 5

23

因此,如果我们查看C99 草案标准部分一元运算符1sizeof段中的语法,如下所示:6.5.3

sizeof unary-expression
sizeof ( type-name )

有一个区别,你不能使用没有括号和部分的类型名称6.5.3.4 sizeof 运算符2段说(强调我的):

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。 [...]

为了完整起见,您可能想知道如果sizeof我们有括号,我们是否可以与表达式一起使用,答案是肯定的,因为一元表达式本身可以包含括号。看到这一点的最简单方法是查看标准草案中的“A.2.1 表达式”部分并像这样处理语法:

unary-expression -> postfix-expression -> primary-expression -> ( expression )
于 2013-09-19T15:26:15.123 回答
21

sizeof是一个运算符,而不是一个函数,所以你不需要()if 操作数是一个表达式(但你通常使用它们)。sizeof * q == sizeof(*q). 请注意,如果操作数是类型,则需要使用(), 所以sizeof(int)(参见例如http://en.wikibooks.org/wiki/C_Programming/Reference_Tables

sizeof      sizeof operator for expressions sizeof 123
sizeof()    sizeof operator for types       sizeof (int)

现在,即使是wiki也充满了关于 C 的信息……世界正在快速变化 :-)

sizeof 运算符用于确定指定数据类型在内存中占用的空间量。要使用 sizeof,关键字“sizeof”后跟一个类型名称或一个表达式(可能只是一个变量名称)。如果使用类型名称,则必须始终将其括在括号中,而表达式可以使用或不使用括号来指定。

于 2013-09-19T15:24:39.907 回答
8

sizeof是一个运算符,特别是一元运算符,如一元&++。它采用一元表达式或用括号括起来的类型名称作为其操作数。

语法是

  sizeof一元表达式 
  sizeof (类型名)

所以,给定一个像这样的声明

int *q;

表达式sizeof *qsizeof (int)是等价的,就像sizeof q和一样sizeof (int *)

于 2013-09-19T15:29:11.583 回答
3

与带括号的 sizeof 相同。它是一个右侧一元运算符,因此它将其正确的大小视为操作数。
据我所知,在将 sizeof 与基本数据类型一起使用时,括号是强制性的。

当你有一个变量时int a,你可以通过两种方式检查它的大小,括号不是强制性的:sizeof asizeof (a)将同样工作。
但是当检查 int 本身的大小时,它只会sizeof (int)起作用。

于 2013-09-19T15:25:03.440 回答
3

与 parens 做的事情相同 - 它返回您传递的任何内容的大小,在这种情况下,是 . 指向的任何内容的大小q

不过,这有点不太清楚,尤其是当我们涉及对 and 的复杂调用时mallocsizeof因此我认为始终使用括号是最佳实践。

于 2013-09-19T15:25:21.043 回答