我有一個關於我已經給的任務的問題。描述下面的代碼
- 有兩個整數a
和b
,其值分別爲-1和1。 運行以下代碼和WHY後,a
和b
的值是多少?
if(!++a)
b+=a++;
當我運行這段代碼,我發現了值1和1。我真的不能找出原因,但...即時得到相當混亂在if語句,任何人都可以解釋這對於初學者嘗試學習C?
我有一個關於我已經給的任務的問題。描述下面的代碼
- 有兩個整數a
和b
,其值分別爲-1和1。 運行以下代碼和WHY後,a
和b
的值是多少?
if(!++a)
b+=a++;
當我運行這段代碼,我發現了值1和1。我真的不能找出原因,但...即時得到相當混亂在if語句,任何人都可以解釋這對於初學者嘗試學習C?
if (!++a)
首先,if (a)
相同if (a != 0)
。奇怪,但真實。零意味着虛假,任何其他數字意味着真實。
說if (!a)
顛倒了這個意思。
++a
增量a
並返回新值。 (不像a++
,這增加a
但返回舊值,而不是新的。)
把所有一起,這是說「增加a
和測試的回答是否是零」。如果a = -1
,那麼這確實是真的。
通常人們會寫if (...) {do stuff}
,但如果「do stuff」部分只有一個語句,可以省略括號。我們已經確定在這種情況下條件是成立的,因此運行「b + = a ++」這一行。
如果我們把一些空間,我們有
b += (a++);
所以,再增加a
,但在此之前,它的(舊)值添加到b
。
++a
給你增量後的值,所以你得到0
這意味着錯誤。 !
運營商使其成爲true
。
那麼你基本上
b = b + a;
a++;
所以b
仍然1
和a
得到另一個增量和1
也結束了。
這裏的主要概念是a++
和++a
之間的區別。如果您使用的是a++
,您將首先獲得值a
,然後該值遞增,而對於++a
,該值首先遞增並返回。
你的代碼是等效於此:
int a = -1;
int b = 1;
a += 1;
if (a == 0) {
b += a;
a += 1;
}
你應該明白爲什麼兩個變量都爲1這裏。現在試着弄清楚爲什麼這些代碼是相同的。
當你的代碼進入if(!++ a)並且它是預先增量的時候,最初a = -1會發生增量,所以a將變成0,!0變成1,它將進入if塊。
now b + = a ++; 這裏一個++是後增量,所以你可以將這個陳述分爲兩部分。
first b + = a; b + = 0所以b將保持爲1.
秒a ++;一個將成爲1.
@Vladp「**當我運行此代碼**」... – 2014-01-25 10:18:58
另外,@OP:讓自己一本很好的C書。答案非常簡單。 '!'是一個邏輯NOT運算符,'++ a'和'a ++'都會減少'a'的值,分別產生已經遞增的和原始的(尚未遞增的)值。 – 2014-01-25 10:19:58
這個問題似乎是無關緊要的,因爲它甚至缺乏對所用語言的最小理解。 – 2014-01-25 10:21:45