我无法理解我的讲师给了什么。
任务是:
给定的代码是:
public class Duplicate{
public static void main(String[] args){
r = r * 10 + ch - '0';
System.out.println();
}
System.out.println(r*2);
}
}
嗯,我可以看到这有效,但我无法理解。然后我决定显示这段代码的每一行的结果。
public class Duplicate{
public static void main(String[] args){
int r = 0;
for (int i = 0; i < args[0].length(); i++){
System.out.println("Iteration " + i);
System.out.println("Initial value of 'r' for this iteration = " + r);
char ch = args[0].charAt(i);
System.out.println("charAt(i) = " + args[0].charAt(i));
System.out.println("r * 10 = " + Integer.toString(r * 10));
System.out.println("r * 10 + ch = " + Integer.toString(r * 10 + ch));
System.out.println("r * 10 + ch - '0' = " + Integer.toString(r * 10 + ch - '0'));
r = r * 10 + ch - '0';
System.out.println();
}
System.out.println(r*2);
}
}
结果是:
Iteration 0
Initial value of 'r' for this iteration = 0
charAt(i) = 3
r * 10 = 0
r * 10 + ch = 51
r * 10 + ch - '0' = 3
Iteration 1
Initial value of 'r' for this iteration = 3
charAt(i) = 2
r * 10 = 30
r * 10 + ch = 80
r * 10 + ch - '0' = 32
64
坦率地说,我无法抓住机制。你能逐行澄清一下发生了什么吗?
答案 0 :(得分:3)
从它的外观来看,您将整数的字符串表示形式转换为整数。
对于循环的每次迭代,您将获得第一个“未消耗”字符。然后你将它“附加”到你的结果整数。
让我们打破你的公式:
r = r * 10 + ch - '0'
为了更好地理解这一点,我将其重写为:
int currentCharacterValue = ch - '0';
r = r * 10 + currentCharacterValue;
假设你有字符串“123”。首先,将r初始化为0。
循环的第一次迭代:
ch = '1'
currentCharacterValue = '1' - '0' = 49 - 48 = 1 ('1' is 49 in ASCII and '0' is 48)
r = 0 * 10 + 1 = 1
循环的第二次迭代:
ch = '2'
currentCharacterValue = '2' - '0' = 50 - 48 = 2
r = 1 * 10 + 2 = 12
循环的第三次迭代:
ch = '3'
currentCharacterValue = '3' - '0' = 51 - 48 = 3
r = 12 * 10 + 3 = 123
所以你最终得到r = 123,它是“123”字符串的整数表示。一旦完成,你只需将r乘以2即可得到最终结果(因为Java只能理解数值的乘法,而不能理解字符串的乘法)。希望这有帮助!
答案 1 :(得分:1)
当您使用字符值添加整数时,将使用字符的ascii值进行添加。这就是为什么当你将'ch'变量加零时你得到51。即使'r'为零,你得到的51 bcoz也就是你在命令行中给出的字符的整数表示
答案 2 :(得分:0)
这样做的目的是教你从一个数字中得到一个整数。
该算法通过我们的位置系统所做的工作来工作,其中
132 = 1*100+3*10+2*1
= ((1*10)+3)*10 + 2
您从0开始,每个数字,您将已经数字乘以10,并添加数字的数值以获得新数字。执行此操作直到处理完所有数字。
现在,数字d的数值正好是(d - &#39; 0&#39;)。这是因为,幸运的是,数字的代码编号按连续顺序排列。请注意,如果不是这样,我们仍然可以使用以下代码找出数字值:
switch (d) {
case '0' : return 0;
case '1' : return 1;
...
}
答案 3 :(得分:-1)
引起极大兴趣的是:
char ch = args[0].charAt(i); //let's further refer it as line 1
和
r = r * 10 + ch - '0'; //let's further refer it as line 2
让我们假设你的程序的参数是32
。
在Java中,命令行程序的所有参数都作为main
传递给String
方法。因此args
数组将包含单个元素 - 字符串“32”。
for
循环遍历此char
的字符(String
变量)。您必须了解的是,表示数字的char
的数值不等于该数字的值。相反,它是该字符的ASCII码给出的数值。
即。 char
到0
的{{1}}数字值介于48到57之间。
让我们看一下第1行(正如我在上面标注的那样)。在那里,您通过9
隔离与您的迭代对应的字符。
第2行的陈述可以分解,以便更好地理解,如下:
String
上述代码段中的第一行执行以下操作:从实际数字字符中减去字符int digitVal = ch - '0';
r = r * 10 + digitVal;
的ASCII值。例如。如果0
为ch
,则'2'
将存储值digitVal
。
然后,在下一行,数字数值用于算术表达式,用于逐步构建数值。例如。如果我们位于数字2
的数字2
,那么该行将会执行:32
,它将r = 3 * 10 + 2
作为32
值存储在int
中}。
完成对数字的迭代后,将存储从r
解析的数字(例如String
作为从32
解析为"32"
的整数)在变量String
中。还有待做的是打印r
乘以2,这发生在r
方法的最后一行。
因此,输入main
的步骤如下:
- 将输入读作32
;那是String
;
- 初始化"32"
;这将存储已解析的数字
- 找到第一个字符:r = 0
作为'char';
- 将其转换为相应的数值(不是ASCII值!);那是'3'
;
- r = r * 10 + 3 = 0 * 10 + 3 = 3;
- 找到第二个字符:3
作为'char';
- 将其转换为相应的数值(不是ASCII值!);那是'2'
;
- r = r * 10 + 2 = 3 * 10 + 2 = 32;
- 打印r * 2
无论如何,这只应作为一个教学示例。以下所有内容都可以在一行代码中更简单地完成:
2
当输入不是数字时,例如,该解决方案也会注意(即抛出异常)。 System.out.println(Integer.parseInt(args[0]) * 2);
或"3a"
。