这很好用:
int foo = bar.charAt(1) - '0';
然而这不是 - 因为bar.charAt(x)返回一个char:
int foo = bar.charAt(1);
似乎从char中减去'0'会将其转换为整数。
为什么或如何减去字符串'0'(或者它是char?)将另一个char转换为整数?
答案 0 :(得分:32)
这是一个聪明的伎俩。 char实际上与短裤的类型/长度相同。现在当你有一个表示ASCII / unicode数字(如'1')的字符,并从中减去最小的ASCII / unicode数字(例如'0'),那么你将留下数字的相应值(因此,1)
因为char与short相同(尽管是unsigned short),所以可以安全地将它转换为int。如果涉及算术,则铸件总是自动完成
答案 1 :(得分:12)
这是一个旧的ASCII技巧,适用于从'0'开始按顺序排列数字'0'到'9'的任何编码。在Ascii中,'0'是一个值为0x30且'9'为0x39的字符。基本上,如果你有一个数字的字符,减去'0'将其转换为它的数字值。
我不得不同意@Lukas Eder并暗示这是一个可怕的伎俩;因为这个动作的意图从代码中明显看出0%。如果您使用的是Java并且String
包含数字,并且您希望将String
转换为int
,我建议您使用Integer.parseInt(yourString);
。
这种技术对于未来的维护程序员来说具有明显的优势。
答案 2 :(得分:2)
以下代码完美无缺!
int foo = bar.charAt(1);
与引用类型类似,可以分配任何Java基元而不转换为被视为子类型的另一个基元。基元的子类型规则由JLS section 4.10.1给出。 char
被视为int
的子类型,因此任何char
都可以分配给int
。
答案 3 :(得分:1)
'0'
也是一个字母。事实证明,Java中的字符具有unicode(UTF-16)值。当您使用带有字符的-
运算符时,Java会使用整数值执行操作。
例如,int x = '0' - 'A';// x = 16
答案 4 :(得分:1)
您的代码可以编译而不会出错&在不抛出异常的情况下运行,但在char和&之间进行转换int是不好的做法。首先,它使代码混乱,导致维护头痛。其次,聪明的“技巧”可以防止编译器优化字节码。获得快速代码的最佳方法之一是编写 dumb 代码(即,不是聪明的代码)。
答案 5 :(得分:0)
因为在Java中如果没有指定带有数字的类型指示符,那么它将采用Integer。 我的意思是,如果你想设置一个Long值,它需要是0L。
对两个不同的数字执行数值运算,结果需要更大。因此,char(它是一个数值)减去一个整数,就会得到一个整数。
你会发现这也有效
long val = bar.charAt(1) - 0L;
答案 6 :(得分:0)
char
隐式转换为int
:
public static void main(String [] args) throws Exception {
String bar = "abc";
int foo = bar.charAt(1) - '0';
int foob = bar.charAt(1);
System.err.println("foo = " + foo + " foob = " + foob);
}
输出:foo = 50 foob = 98
。
也许你放了两个int foo ...
,这是因为它不起作用?
答案 7 :(得分:0)
你的第二个剪辑应该可以正常工作:
int foo = bar.charAt(1);
char
,就像short
或byte
一样,如果需要,将始终默默地投放到int
。
这将编译得很好:int i = 'c';
答案 8 :(得分:0)
如果人们忽略了他的评论,我会回应@马克·彼得斯的讲话。
我引用: ” 不要误以为'0'==0。实际上,'0'== 48 “