2

我正在为期中考试而学习,其中一个问题是以下哪个语句将增加数组中的值,并使指针地址保持不变?圈出 0 个或更多。

int array[10];
int * ptr = array;

1)*ptr++;

2)(*ptr)++;

3)*++ptr;

4)++*ptr;

我以前见过 1 和 2 ,我相信它只是在不更改指针的情况下获取取消引用的值。但我惊讶地发现 3 和 4 实际上是有效的,我对如何理解甚至阅读它感到困惑?是一样的吗?我相信答案是所有 4 个都是有效的。

4

2 回答 2

2

http://en.cppreference.com/w/cpp/language/operator_precedence将对您有所帮助。通读它并根据运算符的优先级将括号放入示例中,希望一切都有意义。

例如,第一个将成为*(ptr++)

于 2013-10-21T01:34:51.543 回答
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])
于 2013-10-28T22:19:35.343 回答