답변
그 다음이 할당이 가능할 것입니다 수있는 경우 JVM이 숫자 리터럴과 변수를 구별 할 방법 다음
int 33 = 44; // oh oh
?
추가 : 이후에 '33 + 1'을 반환하면 '34'또는 '45'를 반환해야합니까? – dognose
나는 'DO 10 1 = 0 TO 10' (for (1 = 0; 1 <= 10; 1 ++)과 동등)이라는 문장을 허용 한 FORTRAN 컴파일러 (예전의 오래된 미니 컴퓨터)를 기억한다. 디스 어셈블 된 코드를 살펴보면 실제로 '1'을위한 리터럴에 0이 할당되었습니다. (분명히 이것은 컴파일러 버그 였지만 그 시간대에는 그러한 버그가 드문 일이 아니 었습니다.) Teletype 인쇄물에서'1'과'I'가 현저하게 유사하기 때문에 오류를 찾기가 어려웠습니다. –
"식별자 이름에 적어도 하나의 알파벳 문자가 있어야합니다"와 같이 덜 엄격한 규칙은 이와 같은 상황을 피할 수 있습니다. 그래서 당신의 예제는 식별자가 숫자로 시작해서는 안되는 이유를 설명하지 않습니다. –
이렇게하면 기호에서 숫자 리터럴에 심각한 PITA라는 이름이 표시됩니다.
예를 들어 첫 번째 문자에 유효한 숫자가있는 경우 0xdeadbeef
또는 0xc00lcafe
의 변수가 유효합니다. 그러나 이것은 16 진수로 해석 될 수도 있습니다. 기호의 첫 번째 문자를 숫자가 아닌 문자로 제한함으로써 이러한 종류의 모호성을 피할 수 있습니다.
이것은 Java와 다른 많은 언어로 이루어 지므로 파서는 주변 컨텍스트에 관계없이 터미널 심볼을 고유하게 분류 할 수 있습니다. 기술적으로,이 숫자처럼 또는 키워드 같이 식별 할 수 있도록 전적으로 가능하다 :
int 123 = 321; // 123 is an identifier in this imaginary compiler
: 예를 들어, 당신은 다음처럼 작성할 수 있도록 식별자에 대한 제한을 리프트 파서를 작성할 수 있습니다 컴파일러는 형식 이름 뒤에 오는 것이 무엇이든간에 변수 이름이어야한다는 것을 충분히 이해하고 있으므로 123
은 식별자이므로 은이 유효한 선언으로 처리 할 수 있습니다. 그러나 이것은 123
이 새로운 "식별자"에 의해 "음영 처리"된 잘못된 숫자가되기 때문에 길 아래로 더 모호한 점을 만듭니다.
결국이 규칙은 컴파일러 디자이너가 간단한 컴파일러 작성을 돕고 프로그래머가 읽을 수있는 코드를 작성하는 데 도움이됩니다. 예
int a real int = 3
공백으로 식별자를 선언하는 것 (즉 "a real int"
단일 식별자) - there were attempts in the past는 식별자의 이름에 대한 특히 까다하지 컴파일러를 구축하는 것을
참고. 그렇다고해서 가독성이 떨어지는 것은 아니기 때문에 현대 컴파일러가 이러한 경향을 포기했습니다.
프로그래머는 물론 컴파일러도 규칙을 간단하게 유지해야합니다.
식별자는 숫자로 해석 할 수없는 임의의 영숫자 시퀀스로 정의 할 수 있지만 컴파일러가 예상 한 것과 다른 방식으로 코드를 해석하는 상황에 처하게됩니다.
예 :
double 1e = 9;
double x = 1e-4;
x
의 결과는 1e-4
로 5
하지만 0.0001
과학적 표기법으로 번호가 아닌 1e
마이너스 4
으로 해석하지 않을 것입니다.
- 1. Java에서 일부 식별자가 불법 인 이유는 무엇입니까?
- 2. 식별자가 숫자로 시작되지 않는 이유는 무엇입니까?
- 3. Java에서 추가 숫자로 파싱 할 수없는 날짜입니다.
- 4. Java에서 배열을 아래쪽으로 셀 수없는 이유는 무엇입니까?
- 5. Java에서 메소드를 찾을 수없는 이유는 무엇입니까?
- 6. Java에서 포인터를 사용할 수없는 이유는 무엇입니까?
- 7. Java에서 ComboBox의 배열을 만들 수없는 이유는 무엇입니까?
- 8. Java에서 메소드를 직렬화 할 수없는 이유는 무엇입니까?
- 9. DllImport에 식별자가 필요한 이유는 무엇입니까?
- 10. Google지도에 숫자로 된 도로 식별자가 있습니까?
- 11. NameNode가 시작될 때 SAFEMODE에 보관되는 이유는 무엇입니까?
- 12. Java에서 문자열을 값이있는 숫자로 파싱하는 방법은 무엇입니까?
- 13. Java에서 문자열을 숫자로 변환하는 방법은 무엇입니까?
- 14. java에 형식 식별자가 필요한 이유는 무엇입니까?
- 15. 식별자가 키워드로 시작될 수있는 렉서 파서는 어떻게 작성합니까?
- 16. 이름이 숫자로 시작될 때 라이브러리/클래스에 대한 javascript 규칙은 무엇입니까?
- 17. 식별자에 '#', '.', ':'을 사용할 수없는 이유는 무엇입니까?
- 18. Java에서 메서드 밖에서 인스턴스화 할 수없는 이유는 무엇입니까?
- 19. Java에서 HttpSession에 넣은 객체를 검색 할 수없는 이유는 무엇입니까? 방법에
- 20. Java에서 wait() 메서드를 재정의 할 수없는 이유는 무엇입니까?
- 21. Java에서 내부 클래스에 액세스 할 수없는 이유는 무엇입니까?
- 22. Java에서 Gremlin을 사용하여 새 정점에 ID를 설정할 수없는 이유는 무엇입니까?
- 23. Java에서 배열의 인덱스를 int로 반환 할 수없는 이유는 무엇입니까?
- 24. Java에서 JNA를 통해 fork를 호출하는 것이 신뢰할 수없는 이유는 무엇입니까?
- 25. "new"키워드로 Java에서 Color를 만들 수없는 이유는 무엇입니까?
- 26. Java에서 내부 클래스의 메서드에 연결할 수없는 이유는 무엇입니까?
- 27. Java에서 이처럼 문자열 배열을 구성 할 수없는 이유는 무엇입니까?
- 28. Java에서 확장 클래스의 인스턴스를 인스턴스화 할 수없는 이유는 무엇입니까?
- 29. 다른 Matlab 함수를 동시에 Java에서 실행할 수없는 이유는 무엇입니까?
- 30. Java에서 부울 식의 임시 변수를 선언 할 수없는 이유는 무엇입니까?
루프를 지정하는 데 'for'가 사용되는 이유는 무엇입니까? 그것은 단지 설계 결정 일뿐입니다. –
* "이 설명서 이외의 다른 설명이 있습니까?"* 당신이 한 가지 이유를 생각할 수 있다면 그것은 나쁜 생각입니다. 왜 다른 것이 필요할까요? – jonrsharpe
주로 그렇게하기 때문에 언어가 버그를 발생시키기 쉽습니다. 무해한 리터럴은 프로그램의 다른 곳에서 편집하여 변수 참조로 변환 할 수 있습니다. –