前缀和后置增量之间的差异与示例

时间:2017-02-02 18:18:55

标签: c windows gcc compiler-errors

给出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]之间的区别是什么?

3 个答案:

答案 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位double0.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