为什么我的计数器不能正常计数?尽管我的 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
条件类似)
问题似乎是您的第二个 if 设置不正确。
如果我没理解错的话,你想检查第二个字母是“)”还是“D”,除非长度是两个。
如果长度 = 2 和第二个字母“)”或者第二个字母等于“D”,你的检查是什么
您可以通过将 if 更改为 if ((&& tgt.charAt(1) == ')'|| tgt.charAt(1) == 'D') && tgt.length() != 2) {
来修复它
所以我的计数器应该不会为字符串 ":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
条件类似)
问题似乎是您的第二个 if 设置不正确。
如果我没理解错的话,你想检查第二个字母是“)”还是“D”,除非长度是两个。
如果长度 = 2 和第二个字母“)”或者第二个字母等于“D”,你的检查是什么
您可以通过将 if 更改为 if ((&& tgt.charAt(1) == ')'|| tgt.charAt(1) == 'D') && tgt.length() != 2) {