if(location[0] <= 'H' || location[0] >= 'A'
&& location[1] <= 8 || location[1] >= 1)
我檢查,以查看是否在第一指數之是「A」和「H」和第二指數之爲1之間 - 這樣的參數會= 1,如果用戶輸入我的邏輯有什麼問題?
8.
{A, 1} -1,如果用戶輸入{Ĵ,1}if(location[0] <= 'H' || location[0] >= 'A'
&& location[1] <= 8 || location[1] >= 1)
我檢查,以查看是否在第一指數之是「A」和「H」和第二指數之爲1之間 - 這樣的參數會= 1,如果用戶輸入我的邏輯有什麼問題?
8.
{A, 1} -1,如果用戶輸入{Ĵ,1}對不起,這裏有新東西。我應該發佈我的整個方法。謝謝你解釋操作符的優先級,但是我的問題是我正在比較一個char和一個int。我所需要做的就是在我的號碼周圍放上''。
void GameBoard::enterShips()
{
char location[2];
int ships = 0;
int count = 1;
while(ships < NUM_SHIPS)
{
cout << "Enter a location for Ship " << count << ": ";
cin >> location[0];
cin >> location[1];
cout << endl;
if((location[0] <= 'H' && location[0] >= 'A') && (location[1] <= '8' && location[1] >= '1'))
{
location[0] = location[0] - 64;
location[1]--;
Grid[location[0]][location[1]] = SHIP;
ships++;
count++;
}
else
{
cout << "Wrong coordinates entered. Try again." << endl << endl;
}
}
}
http://www.asciitable.com/。未來你可能會覺得這很有趣。 – Muggen 2011-02-27 22:53:08
和(&&
)的優先級高於或(||
),這樣來表達你想要什麼,你需要:
if ((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1))
否則發生了什麼就是這樣做的這相當於:
if (location[0] <= 'H' || (location[0] >= 'A' && location[1] <= 8) || location[1] >= 1)
這顯然不是你的原意。
您可以根據需要放置儘可能多的表達式,但您必須記住優先規則;爲了清晰起見,我建議始終使用額外的括號。
耶利米在評論中指出,此情況仍然不會做你想要的東西 - 你是問,如果事情是在給定的範圍內通過檢查,如果它比上限或較大者要麼比下限(這覆蓋了所有輸入),當用來檢查輸入是否比下限比上部較大和較小二者:
if (location[0] <= 'H' && location[0] >= 'A' && location[1] <= 8 && location[1] >= 1)
在這種情況下,由於操作者都是&&
,不需要額外的括號,儘管您可以添加它們以增加清晰度。
加括號以組條件:
if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1))
你需要&&
不是||
秒。例如:'Z' >= 'A' || 'Z' <= 'H'
爲真。
if(location[0] <= 'H' && location[0] >= 'A' && location[1] <= 8 && location[1] >= 1)
雖然在這種情況下沒有必要的,你應該用括號一起組你的邏輯(如果他們是||
是你將不得不爲它按預期工作):
if((location[0] <= 'H' && location[0] >= 'A') && (location[1] <= 8 && location[1] >= 1))
如果位置[0]等於'J'(絕對不在'A'和'H'之間),你的if子句將爲TRUE,因爲即使位置[0] < ='H'爲假,位置[0]> = 'A'爲真,並且您正在使用|| (要麼)。問題是你正在使用|| (OR)而不是& &(AND)。您需要在if子句中使用所有的& &(AND)。
if((location [0] <='H'&& location [0]> ='A')&&(location [1] <= 8 && location [1]> = 1)) - {A,1}假? – bluetickk 2011-02-27 22:35:54
if((location [0] <='H'&& location [0]> ='A')&&(location [1] <= 8 && location [1]> = 1)) - {A,1}返回true,因爲每個單獨的子句都是真實的 – 2011-02-27 23:04:36
&&
優先於||
。所以,你可能希望將其寫成
if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1))
如果你已經嘗試過這一點,請告訴你得到了什麼錯誤
正如你可以看到this operator precedence table,&&
是#13。它高於||
,這是#14。
因此:
if(location[0] <= 'H' || location[0] >= 'A'
&& location[1] <= 8 || location[1] >= 1)
等同於:
if(location[0] <= 'H' || (location[0] >= 'A'
&& location[1] <= 8) || location[1] >= 1)
你想:
if((location[0] <= 'H' || location[0] >= 'A') &&
(location[1] <= 8 || location[1] >= 1))
甚至更好:
if(((location[0] <= 'H') || (location[0] >= 'A')) &&
((location[1] <= 8) || (location[1] >= 1)))
我總是把周圍的一切括號除非*/
和+-
關注。即使你記住桌子,你也不應該假設其他人這樣做。
它有助於代碼的可讀性,並有助於防止錯誤甚至編譯器錯誤!三倍獎金。 :)
編輯:啊,你希望他們都是真實的。只需使用全部&&
s,那麼!此作品:
if(((location[0] <= 'H') && (location[0] >= 'A')) &&
((location[1] <= 8) && (location[1] >= 1)))
這仍然是錯誤的。如果'location [0]'是'L',這將評估爲'真' – Muggen 2011-02-27 22:39:47
@Muggen固定。 :) – 2011-02-27 22:44:56
我想我真的以後,有多少個參數可以放在條件語句裏面? – bluetickk 2011-02-27 22:28:07
以供參考:http://www.cppreference.com/wiki/language/operator_precedence – Muggen 2011-02-27 22:31:56