我正在为期中考试而学习,其中一个问题是以下哪个语句将增加数组中的值,并使指针地址保持不变?圈出 0 个或更多。
int array[10];
int * ptr = array;
1)*ptr++;
2)(*ptr)++;
3)*++ptr;
4)++*ptr;
我以前见过 1 和 2 ,我相信它只是在不更改指针的情况下获取取消引用的值。但我惊讶地发现 3 和 4 实际上是有效的,我对如何理解甚至阅读它感到困惑?是一样的吗?我相信答案是所有 4 个都是有效的。
http://en.cppreference.com/w/cpp/language/operator_precedence将对您有所帮助。通读它并根据运算符的优先级将括号放入示例中,希望一切都有意义。
例如,第一个将成为*(ptr++)
。
每个 C++ 表达式都会产生一个值(主效应)。也可能有副作用(如在上面的例子中)发生在主效应之前(例如示例3和4中的预增量)或之后(例如示例1和2中的后增量)。所以在你的例子中:
1)副作用最后发生:
主要作用:取消引用ptr以获取数组[0] 副作用:将 ptr 增加 4 个字节(在 32 位机器上)2)副作用最后发生:
主要作用:取消引用ptr以获取数组[0] 副作用:增加 *ptr (=array[0]) 13)副作用首先出现:
副作用:将 ptr 预增加 4 个字节(在 32 位机器上) 主要效果:取消引用 *ptr 以获取数组 [0]4)副作用首先出现:
副作用:将 *ptr (= array[0]) 预增加 1 主要效果:取消引用 *ptr 以获取数组 [0]请注意,主要效果是通过忽略副作用运算符 (++) 获得的,因此在所有情况下都是相同的。主效应通常与赋值相结合,如下所示:
int y = *++ptr; // ptr is incrented to point at array[1] and then y becomes equal to *ptr (= array[1])