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

Arp*_*pit 86 c operators sizeof

为什么被sizeof认为是操作员而不是功能?

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

Ste*_*sop 174

因为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不能成为函数,即使有理由想要它也是如此.

  • 不能说更好. (7认同)
  • 哇,就在我的想法! (3认同)
  • 该标准对“sizeof”使用两种表示法:“sizeof unary-expression”和“sizeof (type-name)”——因此在 C11 标准中,它不被视为“强制转换”,而是被视为带括号的类型名称。最终结果大致相同。(作为比较,强制转换表达式是“( type-name )强制转换表达式”。)而且我*讨厌*评论 Markdown 与 Q&A Markdown 的工作方式不同! (3认同)
  • `printf("%d\n", sizeof a)` 并不完全正确。`%d` 是错误的说明符。它具有未定义的行为。 (2认同)

Joh*_*ica 22

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

union foo {
    int i;
    char c[sizeof(int)];
};
Run Code Online (Sandbox Code Playgroud)

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

  • +1但请注意,当参数是VLA - 可变长度数组时,它不是编译时常量. (3认同)

Mic*_*rny 5

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

int a;
printf("%d\n", sizeof a);
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*ner 5

因为C标准是这样说的,它得到了唯一的投票.

标准可能是正确的,因为sizeof需要一种类型和

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

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

(维基百科)