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

时间:2009-09-08 11:56:02

标签: c operators sizeof

为什么sizeof被认为是运算符而不是函数?

有资格成为运营商需要什么财产?

10 个答案:

答案 0 :(得分:167)

因为C标准这样说,并且它获得了唯一的投票。

结果:

  • sizeof的操作数可以是带括号的类型sizeof (int),而不是对象表达式。
  • 括号是不必要的:int a; printf("%d\n", sizeof a);完全没问题。他们经常被看到,首先是因为他们需要作为类型转换表达式的一部分,其次因为sizeof具有非常高的优先级,所以sizeof a + bsizeof (a+b)不同。但它们不是sizeof调用的一部分,它们是操作数的一部分。
  • 您不能使用sizeof的地址。
  • 在运行时不会计算作为sizeof操作数的表达式(sizeof a++不会修改a)。
  • 作为sizeof操作数的表达式可以包含除void或函数类型之外的任何类型。的确,这就是尺寸的重点。

所有这些点上的函数都会有所不同。函数和一元运算符之间可能存在其他差异,但我认为这足以说明为什么sizeof不能成为函数,即使有理由这样做。

答案 1 :(得分:21)

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

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

从语法上讲,如果它不是运算符,则它必须是预处理器宏,因为函数不能将类型作为参数。这将是一个难以实现的宏,因为sizeof可以将类型和变量都作为参数。

答案 2 :(得分:5)

  

因为C标准这样说,并且它获得了唯一的投票。

标准可能是正确的,因为sizeof采用了类型和

  

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

     

此外,当经常使用函数使得它们比通用F(x,y,z,...)形式演化得更快或更容易时,所得到的特殊形式也称为运算符。示例包括中缀运算符,例如加“+”和除“/”,以及后缀运算符,例如factorial“!”。这种用法与所涉实体的复杂性无关。

(Wikipedia)

答案 3 :(得分:4)

因为它不是一个功能。您可以这样使用它:

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

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

答案 4 :(得分:1)

由于:

  • 将值传递给函数时,对象的大小不会传递给函数,因此sizeof“函数”无法确定大小
  • 在C中,函数只能接受一种类型的参数; sizeof()需要接受各种不同的东西(变量和类型!你不能将类型传递给C中的函数)
  • 调用函数涉及复制参数和其他不必要的开销

答案 5 :(得分:1)

与函数有一点不同 - sizeof的值在编译时解析,但不在运行时解析!

答案 6 :(得分:1)

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

答案 7 :(得分:1)

sizeof运算符是编译时实体而非运行时,不需要像函数那样的括号。编译代码时,它会在编译时将该值替换为该变量的大小,但在函数获取执行后的函数中,我们将知道返回值。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

Sizeof(),我想显然它既是函数又是运算符。为什么?因为函数在输入阶段包含用于输入的括号。但是主要也是一个运算符,因为运算符是动作字符,因此sizeof是作用在括号中的操作数上的动作语句。