![](/img/trans.png)
[英]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.