为什么sizeof被视为运算符?


93

为什么将其sizeof视为运算符而不是函数?

要成为运营商,必须具备什么财产?

Answers:


181

因为C标准是这样说的,所以它只有一票。

结果:

  • sizeof的操作数可以是带括号的类型, sizeof (int),而不是对象表达式。
  • 括号是不必要的:int a; printf("%d\n", sizeof a);很好。人们经常看到它们,首先是因为它们需要作为类型转换表达式的一部分,其次是因为sizeof具有很高的优先级,因此sizeof a + b与并不相同sizeof (a+b)。但是它们不是sizeof调用的一部分,而是操作数的一部分。
  • 您不能使用sizeof的地址。
  • 作为sizeof操作数的表达式不会在运行时求值(sizeof a++不会修改a)。
  • 作为sizeof操作数的表达式可以具有除void或函数类型以外的任何类型。确实,这就是sizeof的重点。

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


3
哇,就是我在想的!
crashmstr

7
不能说得更好。
克莱门特·赫雷曼

我相信由于可变长度数组(VLA),如今的情况变得更加复杂。IIRC,sizeof如果表达式中包含VLA ,则该标准甚至允许产生副作用。
亚伦·麦克戴德

@glglgl不,这没有任何意义。在这种情况下,(int)没什么特别的-只是括号内的类型名称。括号是语法的一部分sizeof-取类型的大小时需要括号,而取表达式的大小则不需要。例如参见这里
anatolyg

1
该标准对和使用两种表示法sizeof:-在C11标准中,它不被视为“ cast”,而是被括在括号中的类型名称。最终结果大致相同。(为进行比较,强制转换表达式为。)而且我讨厌注释Markdown与问答Markdown的工作方式不同!sizeof unary-expressionsizeof ( type-name )( type-name ) cast-expression
乔纳森·莱夫勒

24

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

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

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


4
+1,但请注意,当参数为VLA(可变长度数组)时,它不是编译时常量。
乔纳森·莱夫勒

6

因为C标准是这样说的,所以它只有一票。

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

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

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

(维基百科)


这可能解释了C标准(和其他编程语言)使用术语“操作符”和“功能”的动机。
史蒂夫·杰索普

5

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

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

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


2

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


1

因为:

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

1

与函数的差别很小-sizeof的值在编译时解析,但在运行时无法解析!


7
除了VLA-可变长度数组-参数。
乔纳森·莱夫勒

1

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


0

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


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.