簡體   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