2014-11-01 2 views
3

"유효한 숫자뿐 아니라 유효한 숫자가 문자열 일 것입니다."식별자가 Java에서 숫자로 시작될 수없는 이유는 무엇입니까?

다른 설명이 있습니까?

+0

루프를 지정하는 데 'for'가 사용되는 이유는 무엇입니까? 그것은 단지 설계 결정 일뿐입니다. –

+6

* "이 설명서 이외의 다른 설명이 있습니까?"* 당신이 한 가지 이유를 생각할 수 있다면 그것은 나쁜 생각입니다. 왜 다른 것이 필요할까요? – jonrsharpe

+0

주로 그렇게하기 때문에 언어가 버그를 발생시키기 쉽습니다. 무해한 리터럴은 프로그램의 다른 곳에서 편집하여 변수 참조로 변환 할 수 있습니다. –

답변

7

그 다음이 할당이 가능할 것입니다 수있는 경우 JVM이 숫자 리터럴과 변수를 구별 할 방법 다음

int 33 = 44; // oh oh 

?

+1

추가 : 이후에 '33 + 1'을 반환하면 '34'또는 '45'를 반환해야합니까? – dognose

+3

나는 'DO 10 1 = 0 TO 10' (for (1 = 0; 1 <= 10; 1 ++)과 동등)이라는 문장을 허용 한 FORTRAN 컴파일러 (예전의 오래된 미니 컴퓨터)를 기억한다. 디스 어셈블 된 코드를 살펴보면 실제로 '1'을위한 리터럴에 0이 할당되었습니다. (분명히 이것은 컴파일러 버그 였지만 그 시간대에는 그러한 버그가 드문 일이 아니 었습니다.) Teletype 인쇄물에서'1'과'I'가 현저하게 유사하기 때문에 오류를 찾기가 어려웠습니다. –

+2

"식별자 이름에 적어도 하나의 알파벳 문자가 있어야합니다"와 같이 덜 엄격한 규칙은 이와 같은 상황을 피할 수 있습니다. 그래서 당신의 예제는 식별자가 숫자로 시작해서는 안되는 이유를 설명하지 않습니다. –

12

이렇게하면 기호에서 숫자 리터럴에 심각한 PITA라는 이름이 표시됩니다.

예를 들어 첫 번째 문자에 유효한 숫자가있는 경우 0xdeadbeef 또는 0xc00lcafe의 변수가 유효합니다. 그러나 이것은 16 진수로 해석 될 수도 있습니다. 기호의 첫 번째 문자를 숫자가 아닌 문자로 제한함으로써 이러한 종류의 모호성을 피할 수 있습니다.

2

이것은 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는 식별자의 이름에 대한 특히 까다하지 컴파일러를 구축하는 것을

참고. 그렇다고해서 가독성이 떨어지는 것은 아니기 때문에 현대 컴파일러가 이러한 경향을 포기했습니다.

3

프로그래머는 물론 컴파일러도 규칙을 간단하게 유지해야합니다.

식별자는 숫자로 해석 할 수없는 임의의 영숫자 시퀀스로 정의 할 수 있지만 컴파일러가 예상 한 것과 다른 방식으로 코드를 해석하는 상황에 처하게됩니다.

예 :

double 1e = 9; 
double x = 1e-4; 

x의 결과는 1e-45하지만 0.0001 과학적 표기법으로 번호가 아닌 1e 마이너스 4으로 해석하지 않을 것입니다.

관련 문제