为什么被sizeof
认为是运算符而不是函数?
作为运营商需要具备哪些资产?
因为 C 标准是这么说的,所以它得到了唯一的投票。
作为后果:
sizeof (int)
,而不是对象表达式。int a; printf("%d\n", sizeof a);
完全没问题。它们经常出现,首先因为它们需要作为类型转换表达式的一部分,其次因为 sizeof 具有非常高的优先级,因此sizeof a + b
与sizeof (a+b)
. 但它们不是 sizeof 调用的一部分,它们是操作数的一部分。sizeof a++
不修改 a)。一个函数在所有这些点上都会有所不同。函数和一元运算符之间可能还有其他区别,但我认为这足以说明为什么 sizeof 不能成为函数,即使有理由希望它成为函数。
它可以用作编译时常量,只有当它是运算符而不是函数时才有可能。例如:
union foo {
int i;
char c[sizeof(int)];
};
从语法上讲,如果它不是一个运算符,那么它必须是一个预处理器宏,因为函数不能将类型作为参数。这将是一个难以实现的宏,因为sizeof
它可以将类型和变量都作为参数。
因为 C 标准是这么说的,所以它得到了唯一的投票。
标准可能是正确的,因为sizeof
需要一个类型和
通常,如果函数的域或余域(或两者)包含比实数复杂得多的元素,则该函数称为算子。相反,如果函数的域和余域都不包含比实数更复杂的元素,则该函数很可能被简单地称为函数。诸如余弦之类的三角函数是后一种情况的示例。
此外,当函数使用如此频繁以至于它们比通用 F(x,y,z,...) 形式发展得更快或更简单的符号时,由此产生的特殊形式也称为运算符。示例包括中缀运算符,例如加法“+”和除法“/”,以及后缀运算符,例如阶乘“!”。这种用法与所涉及实体的复杂性无关。
因为它不是函数。你可以这样使用它:
int a;
printf("%d\n", sizeof a);
函数确实有入口点、代码等。函数要在运行时运行(或内联),sizeof 必须在编译时确定。
sizeof 运算符是编译时实体而不是运行时实体,并且不需要像函数那样的括号。编译代码时,它会在编译时将值替换为该变量的大小,但在函数执行后的函数中,我们将知道返回值。
因为:
sizeof
“函数”无法确定大小与函数的区别很小 - sizeof 的值在编译时解析,但不是在运行时解析!
因为它是一个编译时运算符,为了计算对象的大小,它需要仅在编译时可用的类型信息。这不适用于 C++。
sizeof()
运算符是编译时会发生的。它可用于确定参数或自变量。
sizeof(),我认为显然它既是函数又是运算符。为什么?因为一个函数在入口阶段为入口保留了括号。但主要也是一个运算符,因为运算符是动作字符,因此 sizeof 是一个动作语句,作用于括号中的操作数。