为什么sizeof被认为是运营商?

为什么sizeof被认为是一个操作符,而不是一个函数?

什么属性是必要的资格作为运营商?

因为C标准是这样说的,所以得到唯一的一票。

结果如下:

  • sizeof的操作数可以是括号types, sizeof (int) ,而不是对象expression式。
  • 括号是不必要的: int a; printf("%d\n", sizeof a); int a; printf("%d\n", sizeof a); 是完美的。 他们经常被看到,首先是因为他们需要作为types转换expression式的一部分,其次,因为sizeof具有很高的优先级,所以sizeof a + bsizeof (a+b)不一样。 但是它们不是调用sizeof的一部分,它们是操作数的一部分。
  • 你不能把sizeof的地址。
  • 作为sizeof的操作数的expression式在运行时不被计算( sizeof a++不会修改a)。
  • 作为sizeof的操作数的expression式可以具有除void或函数types之外的任何types。 事实上,这是有点大小的点。

所有这些方面的function都不相同。 函数和一元运算符之间可能还有其他区别,但是我认为这足以说明为什么sizeof不能成为一个函数,即使有一个理由需要它。

它可以用作编译时常量,只有当它是一个运算符而不是一个函数时才是可能的。 例如:

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

在语法上,如果它不是一个操作符,那么它将不得不是一个预处理macros,因为函数不能把types作为参数。 这将是一个难以实现的macros,因为sizeof可以把这两种types和variables作为一个参数。

因为C标准是这样说的,所以得到唯一的一票。

而标准可能是正确的,因为sizeof需要一个types和

通常,如果函数的域或共域(或两者)包含比实数复杂得多的元素,则该函数被称为运算符。 相反,如果函数的域和共域都不包含比实数更复杂的元素,那么这个函数可能被简单地称为函数。 三angular函数如余弦是后一种情况的例子。

另外,当函数经常被使用以至于它们的演变速度比通用的F(x,y,z,…)forms更快或更容易时,所产生的特殊forms也被称为运算符。 示例包括中缀运算符,如加“+”和除法“/”,以及后缀运算符,如阶乘“!”。 这种用法与所涉实体的复杂性无关。

(维基百科)

因为这不是一个function。 你可以这样使用它:

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

函数具有入口点,代码等。函数在运行时(或内联)运行,sizeof必须在编译时确定。

因为:

  • 当你给一个函数传递一个值的时候,这个对象的大小不会被传递给函数,所以sizeof “function”将无法确定大小
  • 在C中,函数只能接受一种types的参数; sizeof()需要接受各种不同的东西(variables和types!你不能将types传递给C中的函数)
  • 调用一个函数涉及制作参数副本和其他不必要的开销

sizeof运算符是编译时实体而不是运行时,不需要像函数那样的括号。 当编译代码时,它会在编译时用该variables的大小replace值,但是在函数执行后,函数会返回值。

与函数有一点区别 – sizeof的值是在编译时parsing的,但不是在运行时!

因为它是编译时操作符 ,所以为了计算对象的大小,需要只在编译时可用的types信息。 这不适用于C ++。

sizeof()运算符是一个编译时间就会发生。 它可以用来确定参数或参数。