我知道sizeof
从不计算其操作数的值,除非该操作数是VLA,或者我曾经以为。
void g(int n) {
printf("g(%d)\n", n);
}
int main(void) {
int i = 12;
char arr[i]; // VLA
(void)sizeof *(g(1), &arr); // Prints "g(1)"
(void)sizeof (g(2), arr); // Prints nothing
return 0;
}
发生了什么?
以防万一,这是使用GCC 5.1在Coliru编译的。
sizeof
是一个严格的编译时运算符,不会评估其操作数,除非其操作数是VLA,那么它会在运行时评估它。(void)
强制转换与指针无关:它明确地丢弃了刚刚计算出来的sizeof
值。它实际上不会影响程序的行为,但比仅仅计算并将表达式丢弃在地板上(对此,GCC会产生警告)更好的风格。[cont.] - Quentinsizeof
是一个运算符,而不是函数,当它的操作数是表达式时,它不需要括号(对于类型则需要)。这里的括号是为了给逗号运算符(不是参数列表中的逗号)优先级。sizeof
仍然只接受一个操作数,即括号内的结果。 - Quentin