【问题标题】:why won't my counter count properly ? it adds +1 although my if statement isnt filled为什么我的计数器计数不正确?尽管我的 if 语句未填写,但它增加了 +1
【发布时间】:2021-12-21 14:54:51
【问题描述】:

所以我的计数器不应该为字符串":DD" 计数+1,这就是为什么我写了只有当我的字符串长度为2 时计数器才应该加上+1。但是虽然字符串长度是3,但是它加了+1。这是为什么呢?

P.S.:我已将 length() <=3 放在第一个 if 语句中,而另一个 else if 在第二个 if 语句之后。

int counter = 0;
String tgt = ":DD";

for (int i = 0; i < a.size(); i++) {
    if (tgt.length() <= 3 && tgt.charAt(0) == ':' || tgt.charAt(0) == ';') {
        if (tgt.length() == 2 &&  
            tgt.charAt(1) == ')' || tgt.charAt(1) == 'D') {
                counter += 1;
        }
    }
}

【问题讨论】:

  • 代码正在做它应该做的事情, :DD 的长度是三,因此
  • 这是因为tgt.charAt(1) == 'D' 而发生的。第二个“if”中的条件是a&amp;&amp;b||c,如果“c”为真,则为真。
  • 为什么是循环?您没有使用i 的值,因此您可以删除循环并使用counter += a.size(); 来获得相同的结果。您的意思是在您编码tgt.char(1) 的地方使用tgt.char(i)
  • 我已经稍微更改了代码以使我的问题更容易理解 xD 我实际上确实将 i 的值用于 tgt。 tgt 本身不是 ":DD" 而是 a.get(i) 因为我正在检查数组的每个元素 :) 感谢您的评论 :D

标签: java for-loop if-statement count counter


【解决方案1】:

&amp;&amp; 运算符的优先级高于 ||,从而打乱了您的预期逻辑。

Java operators page 按优先顺序列出 Java 运算符。

因此,就好像括号围绕着两个 &amp;&amp; 操作数:

if ((tgt.length() <= 3 && tgt.charAt(0) == ':') || tgt.charAt(0) == ';')
{
    if ((tgt.length() == 2 &&  tgt.charAt(1) == ')') || tgt.charAt(1) == 'D')

在第二个 if 条件中,&amp;&amp; 可能返回 false,但第二个(索引 1)字符是 'D',因此整个条件是 true,并且您的计数器会更新。

在您的 || 操作数周围放置明确的括号,这就是我认为您的意图。

if (tgt.length() <= 3 && (tgt.charAt(0) == ':' || tgt.charAt(0) == ';'))
{
    if (tgt.length() == 2 && (tgt.charAt(1) == ')' || tgt.charAt(1) == 'D'))

【讨论】:

    【解决方案2】:

    这是operator precedence (source: oracle.com) 的案例,不符合我们作为开发人员的期望。 &amp;&amp;-运算符的优先级高于 ||。这意味着

    tgt.length() <= 3 && tgt.charAt(0) == ':' || tgt.charAt(0) == ';'
    

    计算结果与

    相同
    (tgt.length() <= 3 && tgt.charAt(0) == ':') || tgt.charAt(0) == ';'
    

    (注意(... &amp;&amp; ...) 周围的括号)

    如果我们希望首先评估 ||-operator,我们必须添加显式括号:

    tgt.length() <= 3 && (tgt.charAt(0) == ':' || tgt.charAt(0) == ';')
    

    (注意(... || ...) 周围的括号)

    (同样与第二个if-条件)

    Ideone demo

    【讨论】:

      【解决方案3】:

      问题似乎是您的第二个 if 设置不正确。

      如果我理解正确,您想检查第二个字母是“)”还是“D”,除非长度为两个。

      如果它的长度 = 2 和第二个字母“)”或者第二个字母简单地等于一个“D”,你的检查是什么

      您可以通过将 if 更改为 if ((&amp;&amp; tgt.charAt(1) == ')'|| tgt.charAt(1) == 'D') &amp;&amp; tgt.length() != 2) { 来修复它

      【讨论】:

      • if不仅是第2个,也是第1个。
      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 2021-05-16
      • 1970-01-01
      • 2021-09-26
      • 2014-03-26
      • 1970-01-01
      • 2021-03-25
      • 2021-10-04
      相关资源
      最近更新 更多