2011-02-27 114 views
0
if(location[0] <= 'H' || location[0] >= 'A' 
&& location[1] <= 8 || location[1] >= 1) 

我檢查,以查看是否在第一指數之是「A」和「H」和第二指數之爲1之間 - 這樣的參數會= 1,如果用戶輸入我的邏輯有什麼問題?

8.

{A, 1} -1,如果用戶輸入{Ĵ,1}

+0

我想我真的以後,有多少個參數可以放在條件語句裏面? – bluetickk 2011-02-27 22:28:07

+1

以供參考:http://www.cppreference.com/wiki/language/operator_precedence – Muggen 2011-02-27 22:31:56

回答

0

對不起,這裏有新東西。我應該發佈我的整個方法。謝謝你解釋操作符的優先級,但是我的問題是我正在比較一個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; 
     } 
    } 
} 
+0

http://www.asciitable.com/。未來你可能會覺得這很有趣。 – Muggen 2011-02-27 22:53:08

2

和(&&)的優先級高於或(||),這樣來表達你想要什麼,你需要:

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) 

在這種情況下,由於操作者都是&&,不需要額外的括號,儘管您可以添加它們以增加清晰度。

+3

無論如何,'||'運算符必須是'&&';目前,測試將始終通過。 – 2011-02-27 22:29:30

+0

感謝您的迅速回復,但它仍然無法正常工作。因爲假設'location [0]'是''L'',這比'A'''更大,所以它的結果爲'true',所以任何位於邊界外的位置仍然會返回true – bluetickk 2011-02-27 22:32:08

+0

@bluetickk。你需要'&&'。 – Muggen 2011-02-27 22:33:15

0

加括號以組條件:

if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 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

如果位置[0]等於'J'(絕對不在'A'和'H'之間),你的if子句將爲TRUE,因爲即使位置[0] < ='H'爲假,位置[0]> = 'A'爲真,並且您正在使用|| (要麼)。問題是你正在使用|| (OR)而不是& &(AND)。您需要在if子句中使用所有的& &(AND)。

+0

if((location [0] <='H'&& location [0]> ='A')&&(location [1] <= 8 && location [1]> = 1)) - {A,1}假? – bluetickk 2011-02-27 22:35:54

+0

if((location [0] <='H'&& location [0]> ='A')&&(location [1] <= 8 && location [1]> = 1)) - {A,1}返回true,因爲每個單獨的子句都是真實的 – 2011-02-27 23:04:36

0

&&優先於||。所以,你可能希望將其寫成

if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 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))) 
+0

這仍然是錯誤的。如果'location [0]'是'L',這將評估爲'真' – Muggen 2011-02-27 22:39:47

+0

@Muggen固定。 :) – 2011-02-27 22:44:56