2009-09-08 67 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