我对以下代码有疑问。第1行可以重写为*(p ++)= *(p ++)+ 123;
右手边是6 + 123 = 129我明白了。但它如何分配给左手边?
什么*(p ++)作为左手边?谢谢!
int a[] = {6,7,8,9,10};
int *p = a;
*(p++)+=123; //array 129 7 8 9 10 line 1
cout<<*p<<endl;// 7
*(++p)+=123;// array 129 7 131 9 10 line 2
cout<<*p<<endl;// 131
答案 0 :(得分:4)
第1行可以重写为
*(p++) = *(p++)+123;
不,不能;这将增加p
两次。它可以(大致)重写为
int & r = *p++;
r = r + 123;
而第2行更像是
++p;
*p = *p + 123;
但它如何分配给左手边?什么*(p ++)作为左手边?
p++
评估为暂时保留p
的旧值。 *(p++)
取消引用,以指定可指定的左值引用用于指向的对象p
。 +=
修改该对象。
(注意:我正在写关于C ++的文章,虽然你似乎在问两种不同的语言。对于C来说答案可能非常相似,尽管一些标准术语可能有所不同。将来,请决定你使用哪种语言“问一下。”
答案 1 :(得分:1)
这只是非常简短的代码。这是一个更长的版本:
int a[] = {6,7,8,9,10};
int *p = a;
*p += 123; //array 129 7 8 9 10 line 1
p++; // p points to a + 1
cout << *p << endl;// 7
++p; // p points to p + 1 = a + 2
*p += 123;// array 129 7 131 9 10 line 2
cout << *p << endl;// 131
基本上:p++
表示返回p
并在之后递增,而++p
表示先递增并返回结果。
答案 2 :(得分:1)
int a[] = {6,7,8,9,10};
int *p = a;
你的记忆中有这样的东西
--------------------
| 6 | 7 | 8 | 9 | 10 |
--------------------
|
a,p
然后你到达这一行:*(p++)+=123;
这里增量运算符是一个后增量,意味着你将使用当前值p
并在之后增加。
所以我们可以把这个陈述写成两个陈述,第一个是:
(*p) +=123;
所以我们在记忆中得到这个
----------------------
| 129 | 7 | 8 | 9 | 10 |
----------------------
|
a,p
并且第二个语句正在递增p
p++;
你在记忆中得到这个
----------------------
| 129 | 7 | 8 | 9 | 10 |
----------------------
| |
a p
现在第2行:*(++p)+=123;
这里增量首先发生,然后你取消引用指针(用它的新值)并分配它。
所以这个陈述可以再写成两个陈述,第一个是:
++p;
你在记忆中得到这个
----------------------
| 129 | 7 | 8 | 9 | 10 |
----------------------
| |
a p
,第二个陈述是
(*p) += 123; // p is pointing at 8,
你在记忆中得到这个
------------------------
| 129 | 7 | 131 | 9 | 10 |
------------------------
| |
a p
我希望这会有所帮助。