2009-09-08 69 views

回答

152

因爲C標準是這樣說的,它得到的唯一投票。

作爲後果:

  • 的sizeof的操作數可以是parenthesised類型,sizeof (int),而不是一個對象的表達。
  • 括號是不必要的:int a; printf("%d\n", sizeof a);是完全正確的。他們經常被看到,首先是因爲他們需要作爲類型轉換表達式的一部分,其次,因爲sizeof具有很高的優先級,所以sizeof a + bsizeof (a+b)不一樣。但它們不是調用sizeof的一部分,它們是操作數的一部分。
  • 你不能把sizeof的地址。
  • 其是的sizeof的操作數未在運行時計算的表達式(sizeof a++不修改)。
  • 作爲sizeof的操作數的表達式可以具有除void或函數類型之外的任何類型。事實上,這是有點大小的點。

的函數將在所有這些方面不同。函數和一元運算符之間可能還有其他區別,但我認爲這足以說明爲什麼sizeof不能成爲函數,即使有理由希望它成爲函數。

+2

哇,正是我在想什麼! – crashmstr 2009-09-08 11:58:28

+6

不能說更好。 – 2009-09-08 11:58:46

+0

真棒解釋! – 2012-11-03 10:14:13

3

因爲它不是一個功能。您可以使用它像:

int a; 
printf("%d\n", sizeof a); 

功能確實有入口點,代碼等功能是在運行時運行(或內聯)中,sizeof在編譯時間待定。

20

它可被用作一個編譯時間常數,這是唯一可能的,如果它是操作員而不是函數。例如:

union foo { 
    int i; 
    char c[sizeof(int)]; 
}; 

在語法上,如果不是運營商那麼它必須是一個預處理宏,因爲功能才能類型作爲參數。這將是一個難以實現的宏,因爲sizeof可以將兩種類型和變量作爲參數。

+2

+1,但請注意,當參數是VLA - 可變長度數組時,它不是編譯時常量。 – 2009-09-08 12:29:16

1

因爲:

  • 當值傳遞給函數,對象的大小不傳遞給函數,所以sizeof「功能」將沒有確定大小
  • 方式在C中,函數只能接受一種類型的參數; sizeof()需要接受各種不同的事物(變量以及類型!你不能將類型傳遞給C中的函數)
  • 調用函數涉及製作參數副本和其他不必要的開銷
0

有從功能小性差異 - 的sizeof值分解在編譯的時候,而不是在運行時!

+5

不包括VLA - 可變長度數組 - 參數。 – 2009-09-08 12:28:21

5

因爲C標準是這樣說的,它得到的唯一投票。

,標準可能是正確的,因爲sizeof需要一個類型和

一般來說,如果一個函數的域或值域(或兩者)包含的元素顯著比實數越來越複雜,功能被稱爲操作員。相反,如果函數的域和共域都包含比實數更復雜的元素,那麼該函數可能簡單地稱爲函數。三角函數例如餘弦是後一種情況的例子。

此外,當功能被經常使用,它們已經進化比一般的F(X,Y,Z,...)形式更快,更容易的符號,所產生的特殊形式也被稱爲運營商。示例包括中綴運算符,如加「+」和除法「/」,以及後綴運算符,如階乘「!」。這種用法與所涉實體的複雜性無關。

(Wikipedia)

+0

這可能解釋了C標準(和其他編程語言)在使用術語「操作符」和「功能」時的動機。 – 2009-09-08 12:17:06

0

因爲它是一個編譯時操作者的是,爲了計算一個對象的大小,需要鍵入僅可在編譯時間信息。這不適用於C++。

1

sizeof操作符是編譯時的實體不運行時,不需要像括號的函數。當編譯代碼時,它會在編譯時將該值替換爲該變量的大小,但是在函數執行後的函數中,我們將知道返回值。

0

sizeof()運營商是一個編譯時會發生。它可以用來確定參數或參數。

+0

爲什麼downvote? – 2012-10-03 14:36:22