为什么以下代码会产生编译错误?不会charAt()
方法返回char
数据类型吗?
public static void main (String[] args) throws java.lang.Exception
{
String a = "abcd";
char c = a.charAt(2)-'a';
}
error: incompatible types: possible lossy conversion from int to char
答案 0 :(得分:4)
当你减去两个#include<stdio.h>
void hello(FILE ** fp)
{
fclose(*fp);
if( ( *fp = fopen("log","r") ) == NULL)
printf("%s", "Error opening file");
}
void main()
{
char p;
FILE *sf=fopen("prac.txt","r");
hello(&sf);
p=fgetc(sf);
printf("%c",p);
}
时,它们会被提升为char
,并且会对两个int
个操作数执行减法,结果为int
。
您可以转换为int
以将结果分配给char
:
char
请注意,如果减法结果为负值,则可能会出现意外结果,因为char c = (char) (a.charAt(2)-'a');
不能包含负值。
此外,我不确定减去&#39; a&#39;从一个字符中将结果存储在char
中。在您的示例中,它将为您提供数字值为2的字符,该字符与字符&#39; c&#39;无关。
答案 1 :(得分:1)
- 如果任何操作数是引用类型,则取消装箱转换 (§5.1.8)执行。然后:
- 如果任一操作数的类型为double,则为 其他被转换为双倍。
- 否则,如果任一操作数是类型 浮动,另一个转换为浮动。
否则,如果是任一操作数 是long类型,另一个是long。
否则,两者都有 操作数转换为int类型。
因此,您需要将其显式地转换为char以消除可能的有损错误
char c = (char) (a.charAt(2)-'a');
否则,二进制操作的结果将转换为该类型 左侧变量的值,经过值集转换(§5.1.13) 到适当的标准值集(不是扩展指数值) set),转换结果存储在变量中。
答案 2 :(得分:0)
charAt()方法返回char类型但是你要减去两个将返回int值的char,在这种情况下它将是2。所以把它接收到int它会起作用。
int c = a.charAt(2) - 'a';