1. 程式人生 > >c/c++ 一條語句中包含多個i++時程式的執行情況

c/c++ 一條語句中包含多個i++時程式的執行情況

今天覆習高精度時,遇到了個小坑,於是試驗了下。

#include<iostream>
using namespace std;

int main() {
	int i = 1;
	int a[8] = {0, 1, 2, 3, 4, 5, 6, 7};//別忘從a[0]開始存數。
//	a[++i] += 2;                   //# 1執行結果 i = 2  a[2] = 4
//	a[++i] = a[++i] + 2;           //#2 執行結果 i = 3 a[2] = 2 a[3] = 5
//	a[++i] = a[++i] + a[++i] + 2;  //#3 執行結果 i = 4 a[4] = 9
	a[++i] = a[i] + a[++i] + a[i-2] + a[++i] + a[i-2] + 3;//#5 結果會是什麼呢?
//	a[i] = a[++i] + 2;             //#6 執行結果 i = 2 a[2] = 4
	cout << i << " " << a[2] << " " << a[3] << " " << a[4] << " " << a[5];
	
}

i 初始為1.

主要是在用a[++i] += 2這條語句是時,想a[++i] += 2 會不會等價於 a[++i] = a[++i] + 2; 如果是這樣,那就與我想要的a[2] = a[2] + 2;就不同了。 於是我就分別測試了幾組語句。

a[++i] += 2;由的執行結果可知這正是我期望的樣子,i的值只加一次,即a[2] = a[2] + 2。

然後想,語句中有幾個++i時,會不會是先把全部i++加起來,然後在拿加完後的i來操作,賦值呢?試驗表明並非如此。(由#3可知)

後面我又延申的做了幾組測試,結果在註釋裡,由結果可推測出當一條語句中含多個++i時,程式的執行順序為——賦值號左側有++i就先執行加一,然後賦值號右側依次執行++i,且a[++i]的值為當前的值,最後將賦值號左側的值賦給當前i(也就是經過所有++i後的i的值)的值的a[i]。

這裡拿上面的#3來說明下:

i= 1;    a[++i] = a[++i] + a[++i] + 2;

先執行賦值號左側a[++i] 裡的++i 使i = 2 , 然後執行賦值號右側a[++i] 裡的++i使i = 3,使右側第一個a[++i]等價於a[3],然後a[++i],++i, i = 4, a[++i] 等價於a[4], 然後a[3]+a[4]+2=9,此時i = 4,將9賦值給a[4]。

最後為了確定i的值在語句中是實時++i並使用當前值的。我打出了#5這條語句,來測試。輸出結果如我所料附圖。

a[4] = 15。