char c1 = 'a';
// char c2 = c1 + 1; // 컴파일 에러가 발생한다.
char c2 = 'a' + 1; // 컴파일 에러가 발생하지 않는다.
해당 코드에서 리터럴 간의 연산
이 일어나기 때문에 컴파일 에러가 발생하지 않는다.
리터럴 간의 연산
시에는 컴파일 시에 컴파일러가 계산한 뒤에 그 결과를 대체한다.
char c1 = 'a';
char c2 = c1 + 1;
수식에 변수가 들어가 있는 경우에는 컴파일러가 미리 계산을 할 수 없다.
char + int
에서 char형이 int형으로 자동 형변환이 일어난 후 int형으로 결과값이 나온다.
이를 char형에다가 넣기 때문에 컴파일 에러가 발생하는 것이다. 이를 방지하려면 명시적 형변환을 해줘야한다.
char c1 = 'a';
char c2 = (char) c1 + 1;
public static void main(String args[]) {
System.out.println("%b\n", 10.0 == 10.0f); // True
System.out.println("%b\n", 0.1 == 0.1f); // False
}
앞서 말했듯이 float형은 정밀도가 약 7자리, double형은 약 15자리라고 했다.
바로 여기서 차이가 난다.
10.0, 10.0f 오차가 발생하지 않는다.
0.1, 0.1f는 정밀도의 차이로 인해 오차가 발생한다.
float f = 0.1f; // 0.10000000149011612
double d = 0.1; // 0.10000000000000001
그래서 double과 float의 값을 비교하려면 double -> float로 형변환한 다음에 비교해야 올바른 비교가 가능하다.
거짓 또는 참일 확률이 높은 것을 앞에다 배치하여 효율적인 연산을 하게끔 할 수 있다.
참고
https://nullmaster.tistory.com/131
Java의 정석 3판