复制程序

时间:2013-12-15 12:01:46

标签: java

我无法理解我的讲师给了什么。

任务是:

  1. 让我们假设我们从命令行获得一个数字。
  2. 复制该号码。
  3. 给定的代码是:

    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
    
    坦率地说,我无法抓住机制。你能逐行澄清一下发生了什么吗?

4 个答案:

答案 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码给出的数值。

即。 char0的{​​{1}}数字值介于48到57之间。

让我们看一下第1行(正如我在上面标注的那样)。在那里,您通过9隔离与您的迭代对应的字符。

第2行的陈述可以分解,以便更好地理解,如下:

String

上述代码段中的第一行执行以下操作:从实际数字字符中减去字符int digitVal = ch - '0'; r = r * 10 + digitVal; 的ASCII值。例如。如果0ch,则'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"