谁能解释一下为什么这个程序打印4 1而不是4 2?
不应该先执行优先级较高的预增运算符,然后再打印4 2吗?
#include <stdio.h>
int main() {
int a=1;
printf ("%ld %d",sizeof(++a),a);
return 0;
}发布于 2021-02-05 00:20:41
虽然你已经得到了几个答案,但我想再提供一个,因为你的问题实际上包含了三个不同的误解,我想触及所有这些误解。
首先,sizeof是一个特殊的运算符,根据定义,它不计算其参数(即,它接受的任何子表达式的大小)。因此,sizeof(++a)不会递增a。并且sizeof(x = 5)不会将5分配给x。而且sizeof(printf("Hello!"))也不会打印“你好”。
其次,如果我们去掉sizeof,简单地写成
printf("%d %d", ++a, a);我们将无法使用优先级来找出行为。优先级是一个重要的概念,但一般来说,它不能帮助您弄清楚涉及++的混淆操作的行为。
最后,可能令人惊讶的答案是,如果你写下
printf("%d %d", ++a, a);根本不可能弄清楚它会做什么。它基本上是未定义的。(具体地说:在任何像printf("%d %d", x, y)这样的函数调用中,都没有指定参数求值的顺序,所以您不知道首先计算x还是y --尽管有一个顺序。但是,当其中一个是a,另一个是++a时,就会遇到这样一种情况:a既被修改,又使用了它的值,所以无法知道是使用了旧的值还是使用了新值,这使得表达式无法定义。有关此问题的更多信息,请参阅this question。)
附注:还有一个我忘了提的问题,正如来自莫斯科的@Vlad所指出的那样:%ld不是打印sizeof结果的可靠方法,它是size_t类型的值。如果可以,您应该使用%zu,如果不能,则在转换为(unsigned)之后使用%u。
发布于 2021-02-05 00:38:10
来自C标准*6.5.3.4的sizeof和alignof运算符)
2 sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式,也可以是带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。
因此,sizeof运算符的任务是确定用作操作数的表达式的类型,然后知道其操作数的类型,以返回该类型的对象的大小。如果操作数不是可变长度数组,则不会计算用作操作数的表达式,而是在编译时计算sizeof运算符返回的值。
因此,此调用
printf ("%ld %d",sizeof(++a),a);等同于调用
printf ("%ld %d",sizeof( int ),a);在您的系统中,sizeof( int )等同于4。
因此,使用什么表达式(除了使用可变长度数组,其大小是在运行时计算的)作为操作数并不重要。重要的是表达式的类型。例如,你甚至可以写成
printf ( "%zu %d\n", sizeof( ( ++a, ++a, ++a, ++a, ++a ) ), a );得到了同样的结果。
请注意,您应该使用用于size_t类型的值的转换说明符zu,而不是用于有符号的值的ld。那就是你需要写
printf ("%zu %d",sizeof(++a),a);发布于 2021-02-05 00:14:49
根据c99 standard的说法,
sizeof()运算符仅考虑操作数的类型,该类型可以是表达式或类型的名称(即整型、双精度、浮点型等),而不考虑计算表达式时获得的值。
因此,sizeof()运算符中的操作数不求值。
https://stackoverflow.com/questions/66049397
复制相似问题