[英]How to apply the sizeof operator to a function pointer and initialize a structure?
[英]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 12
或sizeof 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.