奇怪的事情发生在for循环中,java
我对编程相当陌生,我开始编写一些基本代码。我试图创建一个算法,在字符串中找到您想要的字符的每个位置。如果我输入“helllo”作为字符串,并希望搜索字符l,它将输出2、3和4。代码运行良好,直到我试图欺骗代码一点来更改某些内容。为此,我首先删除了“for循环”中的终止条件,而是在循环期间添加了一个if语句来中断它。我花了大约2个小时在之后发生的错误上,但我仍然无法发现发生了什么 这是它给我的代码和输出。(我知道我的代码乱七八糟,没有进行适当的优化,但现在我只想知道发生了什么。如果我能让它工作起来,我会重新安排它。谢谢你^-^。) 当我运行代码时,它不会按应有的方式显示“7、8、9、10”(它在字符串Oioriew^^^^^中搜索字符^),而是输出“7-1、8、9、10”。为了修复它,我可以简单地在循环中再次插入终止条件,即“pow!=-1”,但在这一点上,我真的想知道它为什么会发生奇怪的事情发生在for循环中,java,java,Java,我对编程相当陌生,我开始编写一些基本代码。我试图创建一个算法,在字符串中找到您想要的字符的每个位置。如果我输入“helllo”作为字符串,并希望搜索字符l,它将输出2、3和4。代码运行良好,直到我试图欺骗代码一点来更改某些内容。为此,我首先删除了“for循环”中的终止条件,而是在循环期间添加了一个if语句来中断它。我花了大约2个小时在之后发生的错误上,但我仍然无法发现发生了什么 这是它给我的代码和输出。(我知道我的代码乱七八糟,没有进行适当的优化,但现在我只想知道发生了什么。如果我能让它工作起来
public class Tests {
static void zeMethod(String mainString,char charToFind) {
int a = 0;
String b, c;
char chartToConvert;
c = "";
b = "";
for (int pow = mainString.indexOf(charToFind);
; // *the condition was here.*
pow = mainString.indexOf(charToFind, pow + 1)) {
a++;
if (a == 1){
System.out.println("String: "+mainString);
System.out.println("il y a un "+charToFind+" à la/aux position(s)");
}
if (a == 1){
System.out.print(pow);
}
if (a%2 == 0 && pow != -1) {
c = b+", "+pow;
}
if (a%2 != 0 && a != 1 && pow != -1) {
b = c+", "+pow;
}
if (pow == -1){
System.out.print(pow);
break;
}
//*end of loop*
}
if (a%2 != 0){
System.out.println(c);
}
else {
System.out.println(b);
}
}
public static void main(String[] args){
String string = "Oioriew^^^^";
char chara = '^';
zeMethod(string, chara);
}
}
如果我的问题有点不连贯或问得不恰当,我很抱歉。这是我第一次上这个网站,英语不是我的母语。谢谢你抽出时间
编辑:
我知道这个问题一开始并不清楚,但我的意思是,为什么pow在循环的第二次迭代后变成-1。还有,为什么在System.out.print(pow)之后会出现中断;不会让它离开循环。(我也在研究如何使调试器工作。)
[…]它没有按应有的方式显示,“7,8,9,10”[…]它输出“7-1,8,9,10[…]我真的想知道它为什么会发生
听起来你在问为什么它会打印-1
,这是因为你明确要求它:
if (pow == -1){
System.out.print(pow);
break;
}
如果pow
为-1
,则打印pow
(也称-1
)并退出循环
更新 至于为什么要更改输出的顺序,请使用调试器并一次一个语句地逐步执行代码,您将看到 但是,让我们看看:我们可以同意循环将以以下顺序使用
pow
进行迭代:7
,8
,9
,10
,-1
为什么要先打印7
因为循环中包含以下代码:
a++;
if (a == 1){
System.out.print(pow);
}
为什么下一步打印-1
因为循环中没有其他打印语句,如果正确缩进代码,也就是缩进循环的内容,这将更加明显
为什么最后打印8,9,10
因为您在循环之后打印b
或c
的内容,而这是其中任何一个正在打印的内容
请注意第一个值(
-7
)没有添加到b
,因为您在if
语句中明确排除了它。我很好,感谢大家的时间和Andreas的调试器选项。这是任何编程人员都必须具备的。我不知道我之前怎么看不到这一点,但要打破它,它必须变成-1,因为我必须先打破它才能继续编程nt我的答案是,-1是第一个。这不是一个“限制”,它是(用于(初始化;终止;增量){statement}
你是正确的,我会更正它。看起来不错,我会研究它,谢谢。将if
和break
移动到循环体的中的第一个语句(不是最后一个)。顺序很重要。在循环的第二次迭代之前,“增量”发生。然后测试终止。然后执行语句。您当前在语句之后有终止。您希望(初始化;;增量){termination;语句;}
而不是(初始化;;增量){statement(s) ;termination;}
我的错误,我的意思是,为什么代码会将pow更改为7,然后更改为-1,然后更改为8。我知道-1表示找不到字符,但我不知道它为什么会这样做。即使我在打印pow后显式要求从循环中断,它仍然会继续更改为10,然后退出循环。