我正在学习期中考试,其中一个问题是以下哪个语句会增加数组中的值,并保持指针地址不变?圈0或更多。
int array[10];
int * ptr = array;
1)*ptr++;
2)(*ptr)++;
3)*++ptr;
4)++*ptr;
我之前看过1和2,我相信它只是在不改变指针的情况下得到取消引用的值。但我很惊讶地发现3和4实际上是有效的,我很困惑如何理解甚至阅读它?这是一回事吗?我相信答案是所有4个都是有效的。
答案 0 :(得分:2)
http://en.cppreference.com/w/cpp/language/operator_precedence会对您有所帮助。仔细阅读它并根据运算符的优先级将括号括在示例中,所有内容都会有所帮助。
例如,第一个将成为*(ptr++)
。
答案 1 :(得分:1)
每个C ++表达式都会产生一个值(主效应)。也可能存在之前发生的副作用(如上例所示)(例如,预增量) 实施例3和4)或之后(例如实施例1和2中的后增量)主要效果。所以在你的例子中:
1)副作用发生在最后:
主要效果:取消引用ptr获取数组[0]副作用:将增量ptr增加4个字节(在32位机器上)
2)副作用发生在最后:
主要效果:取消引用ptr获取数组[0]副作用:后增量* ptr(= array [0])乘以1
3)首先出现副作用:
副作用:预增加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])