繁体   English   中英

function 的 sizeof 还是运算符?

[英]Is sizeof a function or an operator?

为什么我们说sizeof(variable)是运算符,而不是 function?

它看起来像一个 function 调用,当我考虑运算符的含义时,在我看来像+-*等等

它是一个运算符,因为它不像 function 那样需要 arguments。 它在语法级别运行。

f(int)不是有效的 function 调用,但sizeof(int)sizeof的有效使用。

它还可以对变量或类型进行操作,它的设计非常灵活,这是操作员可以做的事情,因为它深入到 C 语法中。

更多细节可以在这里找到

它是一个运算符,你不需要使用括号,除了“当操作数是类型名时,必须用括号括起来”。 这是一个语法限制,但不应与 function 调用混淆。

请参阅下面来自 GNU 文档的最后一个示例:

size_t a = sizeof(int);
size_t b = sizeof(float);
size_t c = sizeof(5);
size_t d = sizeof(5.143);
size_t e = sizeof a;

如果类型名称没有括号,使用 gcc 编译器时,您可能会看到如下错误:

test.c:7:20: error: expected expression before ‘int’
    7 |  size_t s = sizeof int;
      |                    ^~~

但是做sizeof 12sizeof a很好。

它是一个运算符,因为它内置在语言中。 就像+<它包含在语言语法中。 因此,可以在编译程序时评估sizeof运算符,这与用户定义的 function 不同。 例如,我们可以定义一个 function 宏,它返回一个(非可变长度)数组的长度:

#define LENGTH(array) (sizeof (array) / sizeof (array)[0])

长度表达式在程序编译时计算。 在运行时,数组的长度不可用(除非您将其存储在单独的变量中)。

它是在编译时评估的运算符。

实际上,它仅在T是类型而不是类型的实例时才需要类似函数的语法sizeof(T)

因此,例如,如果您有一个变量int x ,则sizeof x是允许的; 但是 int 类型需要sizeof(int) int

正如语法所示:

unary-expression:
  postfix-expression
  ++ unary-expression
  -- unary-expression
  unary-operator cast-expression
  sizeof unary-expression
  sizeof (type-name)
  _Alignof (type-name)

unary-operator: one of
  & * + - ~ !

它是一个运算符,在采用一unary-expression参数时不仅不需要括号,而且使用括号的行为与 function 调用不同。

考虑给定_Static_assert(sizeof(0)==4,""); ,以下成立:

_Static_assert(sizeof(0)==4,"");
#include <assert.h>
int takeIntGive4(int X){ (void)X; return 4; }
int main()
{
    assert(sizeof(0)["foobar"] == 1  && 1 == sizeof(char)); //if sizeof were more function-like you'd get 'a'
    assert(takeIntGive4(0)["foobar"] == 'a');
}

您可以通过将其包装在宏中来使其更像函数:

#define SIZEOF(X) (sizeof(X))

sizeof还额外返回 integer 常量表达式(与可变长度 arrays (VLA) 一起使用时除外),您可以在case标签、位域大小和数组大小中使用它,并且 ZC1C425268E68385D11AB5074C 可调用表达式是可返回的。

sizeof是一个运算符 它列在C 标准的第 6.5.3p1 节中的一元运算符列表中:

6.5.3 一元运算符

句法

unary-expression: postfix-expression ++ unary-expression -- unary-expression unary-operator cast-expression sizeof unary-expression sizeof (type-name) _Alignof (type-name) unary-operator: one of & * + - ~ !

如上图所示,它有两个 forms。 第一种形式是sizeof后跟一个表达式。 请注意,在这种形式中括号不是必需的,这与它们所在的 function 调用不同。 第二种形式是sizeof后跟括号中的类型名称。 只有第二种形式需要括号,并且不能向 function 传递类型名称。

它在第 6.5.3.4 节中进一步称为运算符:

6.5.3.4 sizeof_Alignof运算符

...

2 sizeof运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。 大小由操作数的类型决定。 结果是 integer。 如果操作数的类型是变长数组类型,则计算操作数; 否则,不计算操作数,结果为 integer 常量

function 的 sizeof 还是运算符?
为什么我们说 sizeof(variable) 不是 function 的运算符?

除了其他已回答的内容外,代码可以获取 function 的地址,但不能获取sizeof的地址。 很像 can 不能获取=*的地址。

size_t (*f1)() = strlen;
size_t (*f2)() = sizeof;
//                     ^ error: expected expression before ';' token

对于对象, sizeof不需要() ,这与 function 调用不同。

char array[42];
size_t n1 = sizeof array;
size_t n2 = strlen(array) + 1;
 

sizeof可以与types一起使用,而不是与 function 调用一起使用。

size_t sz1 = sizeof(double);
size_t sz2 = printf(double);
//                  ^ error: expected expression before 'double'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM