我的逻辑出了什么问题?

时间:2011-02-27 22:25:28

标签: c++

if(location[0] <= 'H' || location[0] >= 'A' 
&& location[1] <= 8 || location[1] >= 1)

我正在检查第一个指标是否在'A'和'H'之间,第二个指数是在1-8之间。

如果用户输入{A,1},则参数将= 1 如果用户输入{J,1}

,则为-1

7 个答案:

答案 0 :(得分: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)

这显然不是你想要的。

您可以根据需要在条件中放置尽可能多的表达式,但必须记住优先级规则;为了清晰起见,我建议总是使用额外的括号。

正如Jeremiah在评论中所指出的那样,情况仍然不会做你想要的 - 你要问的是某些东西是否在给定的范围内,检查它是否 小于上限或大于下限(这涵盖所有输入),当您打算检查输入是否大于下限且小于上限时

if (location[0] <= 'H' && location[0] >= 'A' && location[1] <= 8 && location[1] >= 1)

在这种情况下,由于运算符都是&&,因此不需要额外的括号,但为了更加清晰,可以添加它们。

答案 1 :(得分:1)

您需要&&而不是|| s。例如:'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))

答案 2 :(得分:0)

添加括号以对条件进行分组:

if( (location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1))

答案 3 :(得分:0)

如果location [0]等于'J'(绝对不在'A'和'H'之间),你的if子句将为TRUE,因为即使location [0]&lt; ='H'为FALSE, location [0]&gt; ='A'为TRUE,你正在使用|| (要么)。问题是你正在使用|| (或)代替&amp;&amp; (和)。你需要使用所有&amp;&amp; (AND)在if子句中。

答案 4 :(得分:0)

&&的优先级高于||。所以,你可能想把它写成

if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1))

如果你已经尝试过这个,请告诉你有什么错误

答案 5 :(得分: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;
        }
    }
}

答案 6 :(得分:-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)))