为什么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 + b
与sizeof (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()
运算符是一个编译时间就会发生。 它可以用来确定参数或参数。