为什么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的重点。如果它是一个运算符而不是函数,它可以用作编译时常量。例如:
union foo {
int i;
char c[sizeof(int)];
};
从语法上来说,如果它不是运算符,那么它必须是预处理器宏,因为函数不能将类型作为参数。这将是一个难以实现的宏,因为 sizeof
可以将类型和变量作为参数。
int a;
printf("%d\n", sizeof a);
函数确实有入口点、代码等。函数在运行时(或内联)运行,sizeof必须在编译时确定。
原因如下:
sizeof
“函数”无法确定大小因为它是一个编译时运算符,为了计算对象的大小,需要在编译时才能获得的类型信息。但这对于C++来说并不适用。
sizeof运算符是编译时实体而不是运行时实体,不需要像函数一样加括号。当代码被编译时,它会在编译时将该变量的大小替换为值,但在函数中,在函数执行后我们才会知道返回的值。
函数和 sizeof 的值有所不同 - sizeof 的值在编译时解析,而不是在运行时解析!
sizeof()
运算符是一个编译时发生的事件。它可以用于确定参数或参数的大小。
Sizeof(),我认为显然它既是一个函数又是一个运算符。为什么呢?因为在输入阶段,函数需要括号进行输入。但主要也是一个运算符,因为运算符是动作字符,因此sizeof是一个操作语句,对括号中的操作数进行操作。
sizeof
是一个运算符。 - phuclv
sizeof
具有副作用。 - Aaron McDaid(int)
只是括号内的类型名称,没有什么花哨的东西。这里的括号是sizeof
语法的一部分 - 在获取类型大小时需要它们,但在获取表达式大小时不需要它们。例如,请参见此处。 - anatolygsizeof
:sizeof 一元表达式
和sizeof (类型名)
— 因此在 C11 标准中,它不被认为是“强制转换”,而是带圆括号的类型名。最终结果大致相同。(作为比较,强制转换表达式为(类型名) 强制转换表达式
。)我讨厌注释 Markdown 与问答 Markdown 的差异工作方式! - Jonathan Lefflerprintf("%d\n", sizeof a)
并不完全正确。%d
是错误的说明符,它具有未定义的行为。 - Ayxan Haqverdili