這段程序的運行結果是什麼?0麼?請看下面的截圖
沒錯,不是0,是1!
你可能會懷疑:為什麼是1不是0?暫且我們不談這個。
p=a[0]=&a[0][0]這個想必大家都知道,於是p[0]也就代表著*(p+0)也就是*(&a[0][0]),由*與&互為逆運算可知p[0]就是a[0][0]。
那麼問題來了!a[0][0]是什麼?
很多人可能會以為a[0][0]是0,實則不然。在下圖這種情況下
a[0][0]的確是0,細心觀察可以發現兩端代碼之間的微小差異,沒錯,就是()與{ }的差別。
我們在初始化二維數組的時候 ,對同一行的元素都用{ }進行聚合,{ }的作用是劃分區域,每個{ }內為一行的元素,此外 { }並不是運算符。而()為優先級一級的運算符,但並不能在初始化二維數組的時候劃分每行元素。That is to say...int a[3][2]={(0),(1),(2)};和.int a[3][2]={0,1,2};是完全等價的......
但是...那個逗號是怎麼回事呢!?
說到這裡,就不得不提到一個很容易被我們忽視的運算符“,”了。它叫做逗號運算符,又名順序求值運算符,在所有的運算符中優先級是最低的(第15級)。由逗號運算符構成的表達式也叫逗號表達式(順序表達式),形式為
表達式1,表達式2,……,表達式 n
在使用的時候,按順序依次求出表達式1,2,3,......,n的值並取表達式n的值作為整個逗號表達式的值。
看完了這裡想必大家也就明白了為何習題4的結果是1不是0了吧,實際上
也可以寫為int a[3][2]={1,3,5};
僅僅對a[0][0],a[0][1],a[1][0]分別賦值了1,3,5,其余元素值為0。所以輸出a[0][0]的值當然就是1咯~
另附一道思考題:
}
上述程序的輸出結果是:
正確答案應該是2,3,1