У меня вопрос о следующем коде. строка 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
строка 1 может быть переписана как
*(p++) = *(p++)+123;
Нет, не может; что увеличит p
вдвое. Он может быть (приблизительно) переписан как
int & r = *p++;
r = r + 123;
в то время как строка 2 больше похожа на
++p;
*p = *p + 123;
Но как это назначить левой стороне? что делает * (p++) работает как левая сторона?
p++
оценивает временное сохранение старого значения p
. *(p++)
которые дают присваиваемое значение lvalue, относящееся к объекту p
на который указывает точка. +=
изменяет этот объект.
(ПРИМЕЧАНИЕ: Я пишу о C++, хотя вы, кажется, спрашиваете о двух разных языках. Ответ, вероятно, очень похож на C, хотя некоторые из стандартных терминов могут отличаться. В будущем, пожалуйста, выберите, какой язык вы используете, спрашивать о.)
Это очень короткий код. Вот более длинная версия:
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++
означает return p
и увеличивает его после, тогда как ++p
означает, что он увеличивает его и возвращает результат.
после выполнения
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,
(*p) += 123;//p is pointing at 8,
и вы получаете это в памяти
------------------------
| 129 | 7 | 131 | 9 | 10 |
------------------------
| |
a p
Надеюсь, это поможет.
a+=b
эквивалентноa=a+b
за исключением того, чтоa
оценивается только один раз.