为什么我的计数器不能正常计数?尽管我的 if 语句未填写,但它添加了 +1

why won't my counter count properly ? it adds +1 although my if statement isnt filled

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

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;
        }
    }
}

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

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

因此,两个 && 操作数就好像是括号:

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

在第二个if条件中,&&可能return为假,但是第二个(索引1)字符是'D',所以整个条件是true 并且您的计数器得到更新。

在您的 || 操作数周围放置显式括号,我认为这正是您的意图。

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

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

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

计算出与

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

(注意 (... && ...) 两边的括号)

如果我们希望首先计算 ||-运算符,我们必须添加显式括号:

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

(注意 (... || ...) 两边的括号)

(与第二个 if 条件类似)

Ideone demo

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

如果我没理解错的话,你想检查第二个字母是“)”还是“D”,除非长度是两个。

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

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

来修复它