【问题标题】:What does sizeof without () do? [duplicate]不带 () 的 sizeof 有什么作用? [复制]
【发布时间】:2013-09-24 18:39:21
【问题描述】:

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

sizeof 在 C 中不带括号和/或类型使用时会做什么?

【问题讨论】:

标签: c sizeof


【解决方案1】:

因此,如果我们在C99 draft standard 部分6.5.3 一元运算符 段落1 中查看sizeof 的语法如下:

sizeof unary-expression
sizeof ( type-name )

你不能使用没有括号的 type-name6.5.3.4 部分的区别 sizeof 运算符 段落 2 说( 强调我的):

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

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

unary-expression -> postfix-expression -> primary-expression -> ( expression )

【讨论】:

    【解决方案2】:

    sizeof 是运算符,而不是函数,因此如果操作数是表达式(但您通常使用它们),则不需要 ()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”后跟一个类型名称或一个表达式(可能只是一个变量名称)。如果使用类型名称,则必须始终将其括在括号中,而表达式可以使用或不使用括号来指定。

    【讨论】:

      【解决方案3】:

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

      语法是

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

      所以,给定一个类似的声明

      int *q;
      

      表达式sizeof *qsizeof (int) 是等价的,sizeof qsizeof (int *) 也是等价的。

      【讨论】:

        【解决方案4】:

        与括号相同 - 它返回您传递的任何内容的大小,在本例中为 q 指向的任何内容的大小。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-05-25
            • 2021-12-17
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 1970-01-01
            • 2012-08-27
            • 1970-01-01
            • 2014-08-19
            相关资源
            最近更新 更多