为什么在 C 中,当多个操作数以逗号分隔传递时,函数 sizeof() 输出最右边操作数的大小?
Why in C does the function sizeof() output the size of right most operand when more than one operands are passed separated by comma?
我在 C 中有以下代码:
#include <stdio.h>
void main() {
printf("%d %d\n",sizeof(5),sizeof(5,5));
printf("%d %d\n",sizeof(5),sizeof(5.0,5));
printf("%d %d\n",sizeof(5),sizeof(5,5.0));
}
我得到输出:
4 4
4 4
4 8
我知道 sizeof(5) 会 return 整数的大小而 sizeof(5.0) 会 return 双精度的大小,但为什么它给出最右边的大小以逗号分隔传递多个参数的情况下的操作数?为什么不是第一个参数或所有参数的总大小?
我正在使用 OnlineGDB.com C 编译器进行在线编译。
感谢您的帮助。
因为逗号运算符的结合性是从左到右。
只使用最右边的表达式,其余的被丢弃(尽管它的副作用与排序有关)。
因此,
sizeof(5.0,5)
等价于 sizeof(5)
和
sizeof(5,5.0)
等同于 sizeof(5.0)
原因很简单:因为sizeof
不是一个函数!它是一个运算符,它的右边有一些表达式。在句法上,它的行为与 return
运算符相同。括号只是程序员为了清楚起见而添加的,在大多数情况下不需要:
sizeof(foo); //no surprise, take the size of the variable/object
sizeof foo; //same as above, the parentheses are not needed
sizeof(void*); //you cannot pass a type to a function, but you can pass it to the sizeof operator
sizeof void*; //same as above
typedef char arrayType[20]
arrayType* bar; //pointer to an array
sizeof(*bar); //you cannot pass an array to a function, but you can pass it to the sizeof operator
sizeof*bar; //same as above
//compare to the behavior of `return`:
return foo; //no surprise
return(foo); //same as above, any expression may be enclosed in parentheses
那么,当您说 sizeof(5, 5.0)
时会发生什么?好吧,因为 sizeof
是一个运算符,所以 括号不是函数调用 ,而是像 1*(2 + 3) == 5
中的括号一样解释。在这两种情况下,(
都跟在运算符之后,因此不会被解释为函数调用。因此,逗号不会分隔函数调用参数(因为没有函数调用),而是被解释为逗号运算符。并且 逗号运算符被定义为评估其两个操作数,然后 return 最后一个操作数的值。 sizeof
的运算符性质决定了表达式如何右侧已解析。
我在 C 中有以下代码:
#include <stdio.h>
void main() {
printf("%d %d\n",sizeof(5),sizeof(5,5));
printf("%d %d\n",sizeof(5),sizeof(5.0,5));
printf("%d %d\n",sizeof(5),sizeof(5,5.0));
}
我得到输出:
4 4
4 4
4 8
我知道 sizeof(5) 会 return 整数的大小而 sizeof(5.0) 会 return 双精度的大小,但为什么它给出最右边的大小以逗号分隔传递多个参数的情况下的操作数?为什么不是第一个参数或所有参数的总大小?
我正在使用 OnlineGDB.com C 编译器进行在线编译。
感谢您的帮助。
因为逗号运算符的结合性是从左到右。
只使用最右边的表达式,其余的被丢弃(尽管它的副作用与排序有关)。
因此,
sizeof(5.0,5)
等价于 sizeof(5)
和
sizeof(5,5.0)
等同于 sizeof(5.0)
原因很简单:因为sizeof
不是一个函数!它是一个运算符,它的右边有一些表达式。在句法上,它的行为与 return
运算符相同。括号只是程序员为了清楚起见而添加的,在大多数情况下不需要:
sizeof(foo); //no surprise, take the size of the variable/object
sizeof foo; //same as above, the parentheses are not needed
sizeof(void*); //you cannot pass a type to a function, but you can pass it to the sizeof operator
sizeof void*; //same as above
typedef char arrayType[20]
arrayType* bar; //pointer to an array
sizeof(*bar); //you cannot pass an array to a function, but you can pass it to the sizeof operator
sizeof*bar; //same as above
//compare to the behavior of `return`:
return foo; //no surprise
return(foo); //same as above, any expression may be enclosed in parentheses
那么,当您说 sizeof(5, 5.0)
时会发生什么?好吧,因为 sizeof
是一个运算符,所以 括号不是函数调用 ,而是像 1*(2 + 3) == 5
中的括号一样解释。在这两种情况下,(
都跟在运算符之后,因此不会被解释为函数调用。因此,逗号不会分隔函数调用参数(因为没有函数调用),而是被解释为逗号运算符。并且 逗号运算符被定义为评估其两个操作数,然后 return 最后一个操作数的值。 sizeof
的运算符性质决定了表达式如何右侧已解析。