【问题标题】:Interpreting lvalue and rvalue with notation arr+4 and arr++用符号 arr+4 和 arr++ 解释左值和右值
【发布时间】:2017-08-09 16:12:08
【问题描述】:
   int arr[5];

   arr++;                                                        
   arr+4;                  //compile with only this 
   printf("%u", arr);

为什么 C 语言编译器不能编译 arr++ 说“需要左值”但可以 使用arr+4 编译成功? arr++ 符号的左值概念是什么?

【问题讨论】:

  • arr 最终不是左值(因为它是衰减的结果),您只能对左值使用修改增量运算符。添加没有这样的限制(例如说1 + 1是有效的)。
  • 发布一个完整的程序,其他人可以编译和测试。

标签: c


【解决方案1】:

当您使用arr 时,它可以自然衰减 指向其第一个元素的指针,即它等同于&arr[0]

当您执行arr++ 时,您会尝试修改此指针(实际上是在执行arr = arr + 1)。这是不可能的,因为数组的位置是固定的,不能修改。

使用arr + 4,您正在执行指针运算。在这里,您将4 添加到衰减的指针,但您不尝试修改指针本身。这实际上等于&arr[4]


您显示的代码中还有另一个小问题。我说的是小,但我的意思是

printf("%u", arr);

你让数组衰减到一个指针。然后您尝试使用"%u" 格式说明符打印此指针。 但是该格式说明符是打印int,而不是指针。格式说明符和参数类型不匹配会导致未定义的行为

要识别通用 (void *) 指针,您需要使用 "%p" 格式,并将指针转换为 void *

printf("%p", (void *) arr);

【讨论】:

  • 实际上arr+4; 什么都不做。在语法上是正确的,但它是一个没有效果的语句,将被忽略
  • 谢谢。我明白了。很好的解释。
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 2019-12-19
  • 2011-04-27
  • 2012-02-13
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多