为什么 Char 不打印,计数器超出了我的循环;
Why Char won't print, and counter exceeded my loop;
我正在尝试 运行 这三个并发线程,但是当我这样做时 system.print
Char 不会出来,计数器 "i" 越界。
不知何故,我在Char前面加了一个字符串,打印正确,谁能给我解释一下为什么会这样?
public class Part2 {
public static void main(String[] args) {
Runnable printA = new PrintChar('a');
Runnable printB = new PrintChar('b');
Runnable printC = new PrintChar('c');
Thread t1 = new Thread(printA);
Thread t2 = new Thread(printB);
Thread t3 = new Thread(printC);
t1.start();
t2.start();
t3.start();
}
private static class PrintChar implements Runnable {
private char c;
public PrintChar(char c) {
this.c = c;
}
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print(c + i + ", ");
}
}
}
}
/*这是这段代码的输出:
98, 100, 101, 102, 103, 104, 105, 99, 99, .... 198, */
/*如果我像这样在Char之前添加一个String
这是我预期的输出; */
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print("" + c + i + ", ");
}
}
/* b1, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,....
a1 ~ a100
b1 ~ b100
和 c1 ~ c100 运行s 并同时完成 */
当您在 char
和 int
上使用 +
运算符时,它执行算术加法,而不是字符串连接。将 "" +
放在首位意味着您首先进行 "" + c
,这是连接到 String
,然后将 String
添加到 int
,这是另一个连接.
+
运算符在Java中有两个含义。它可以代表:
加法如果两个操作数都是数值类型,而char
被认为是数值类型,因为它的值在内部是表示字符在Unicode Table 与 'a'
一样,它将是 97(十进制,或十六进制为 61)。
连接 如果至少一个操作数是字符串。
此外,由于计算是从左到右进行的,c + i + ", "
等同于 (c + i) + ", "
。在 (c + i)
处,c
和 i
都是 numeric 类型,因此 +
表示加法并计算 'a'+1
其中 'a'
如前所述被视为 97,因此您看到 97+1
的结果是 98。
之后的下一个操作是98 + ", "
,这里第二个操作数是字符串,所以这里的+
代表连接。所以 98 + ", "
结果为字符串 "98, "
.
在 "" + c + i + ", "
的情况下,由于 left-to-right 评估顺序,我们可以将其表示为 (("" + c) + i) + ", "
。
- 起初
("" + c)
会 "calculated" 并且由于第一个操作数是字符串 +
表示连接,所以我们最终得到 "" +'a'
结果为字符串 "a"
.
- 下一个
"a" + i
被执行,这里第一个操作数也是 String 类型,所以 +
也表示连接结果为 String "a1"
- 最后执行
"a1" + ", "
。这里两个操作数都是字符串,所以 +
是串联,结果是 "a1, "
string.
我正在尝试 运行 这三个并发线程,但是当我这样做时 system.print Char 不会出来,计数器 "i" 越界。
不知何故,我在Char前面加了一个字符串,打印正确,谁能给我解释一下为什么会这样?
public class Part2 {
public static void main(String[] args) {
Runnable printA = new PrintChar('a');
Runnable printB = new PrintChar('b');
Runnable printC = new PrintChar('c');
Thread t1 = new Thread(printA);
Thread t2 = new Thread(printB);
Thread t3 = new Thread(printC);
t1.start();
t2.start();
t3.start();
}
private static class PrintChar implements Runnable {
private char c;
public PrintChar(char c) {
this.c = c;
}
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print(c + i + ", ");
}
}
}
}
/*这是这段代码的输出: 98, 100, 101, 102, 103, 104, 105, 99, 99, .... 198, */
/*如果我像这样在Char之前添加一个String 这是我预期的输出; */
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print("" + c + i + ", ");
}
}
/* b1, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,.... a1 ~ a100 b1 ~ b100 和 c1 ~ c100 运行s 并同时完成 */
当您在 char
和 int
上使用 +
运算符时,它执行算术加法,而不是字符串连接。将 "" +
放在首位意味着您首先进行 "" + c
,这是连接到 String
,然后将 String
添加到 int
,这是另一个连接.
+
运算符在Java中有两个含义。它可以代表:
加法如果两个操作数都是数值类型,而
char
被认为是数值类型,因为它的值在内部是表示字符在Unicode Table 与'a'
一样,它将是 97(十进制,或十六进制为 61)。连接 如果至少一个操作数是字符串。
此外,由于计算是从左到右进行的,c + i + ", "
等同于 (c + i) + ", "
。在 (c + i)
处,c
和 i
都是 numeric 类型,因此 +
表示加法并计算 'a'+1
其中 'a'
如前所述被视为 97,因此您看到 97+1
的结果是 98。
之后的下一个操作是98 + ", "
,这里第二个操作数是字符串,所以这里的+
代表连接。所以 98 + ", "
结果为字符串 "98, "
.
在 "" + c + i + ", "
的情况下,由于 left-to-right 评估顺序,我们可以将其表示为 (("" + c) + i) + ", "
。
- 起初
("" + c)
会 "calculated" 并且由于第一个操作数是字符串+
表示连接,所以我们最终得到"" +'a'
结果为字符串"a"
. - 下一个
"a" + i
被执行,这里第一个操作数也是 String 类型,所以+
也表示连接结果为 String"a1"
- 最后执行
"a1" + ", "
。这里两个操作数都是字符串,所以+
是串联,结果是"a1, "
string.