给出float ar[] = {0,0,1,2.7};
printf("%f", ar[++2]);
问1)你能否告诉我为什么会收到错误:在c语言的gcc编译器中,lvalue需要作为递增操作数。
问2)为什么int ar[] = {0,0,1,2.7};
printf("%f", ar[3]);
输出0.000000?是因为2.7不能转换成整数吗?并且它不能转换为整数,因为与float?
相比,整数存储在小的字节数中 ar[i]++
,ar[i++]
,ar[++i]
之间的区别是什么?
答案 0 :(得分:1)
问1)你能告诉我为什么我会收到错误:在c语言的gcc编译器中,左值需要作为增量操作数。
因为字面值2
不是您可以修改的左值。 ++2
没有意义。
为什么int ar [] = {0,0,1,2.7};
printf("%f",ar [3]);
ar
是一个int
数组。因此,由于格式说明符不正确,使用ar[3]
打印%f
会导致undefined behaviour。使用%d
打印int
值。
答案 1 :(得分:1)
printf("%f", ar[++2]);
问1)你能告诉我为什么我会收到错误:在c语言的gcc编译器中,左值需要作为递增操作数。
出于同样的原因,你不能写2=3
之类的东西。表达式2
与内存区域无关,因此您可以为其写入新值。
问2)为什么int ar[] = {0,0,1,2.7}; printf("%f", ar[3]);
输出0.000000?是因为2.7不能转换成整数吗?
没有。 2.7
将被转换并存储为整数值2
。问题是您使用带有%f
参数的int
格式说明符,因此行为是 undefined 。
您基本上告诉printf
将位模式0x00000002
解释为64位double
。 0.000000
是一种可能的输出,但远非唯一的输出。
ar [i] ++,ar [i ++],ar [++ i]之间有什么区别?
ar[i]++
大致相当于ar[i] = ar[i] + 1
ar[i++]
大致相当于ar[i]; i = i + 1
ar[++i]
大致相当于ar[i + 1]; i = i + 1
。
答案 2 :(得分:0)
后缀和前缀运算符应在lvalues
上执行,因此++2
是非法的,这就是你得到的原因
value required as increment operand in gcc
什么是左值?
lvalue
的参数是可以由地址引用的数据对象。
在您的情况下,2
只是一个不能被地址引用的文字。
ar [i] ++,ar [i ++],ar [++ i]之间有什么区别?
非常粗略的术语x++(postfix)
表示取当前值,然后递增x
,++x(prefix)
表示先递增值,然后取结果。所以
x=ar[i]++;
// means store the current value of ar[i] to x and then increment ar[i] by one
x=ar[i++];
// no difference except that you're applying the postfix to the index
x=ar[++i];
// Here take the incremented value of i and then compute ar[i]
x=ar[i++];
// Here take the current value of i to compute a[i] and then increment i by one