[c++] 변수 이름을 숫자로 시작할 수없는 이유는 무엇입니까?

“왜 변수 이름을 숫자로 시작할 수 없는가?”라는 질문을하면서 얼마 전 새로운 C ++ 개발자와 함께 일하고있었습니다.

일부 숫자에는 텍스트가있을 수 있으며 (123456L, 123456U), 어떤 양의 알파 문자가있는 모든 것이 변수 이름이라고 생각하면 불가능할 것입니다.

정답입니까? 더 이상의 이유가 있습니까?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?



답변

따라서 숫자 문자열은 유효한 식별자 일뿐만 아니라 유효한 식별자 일 것입니다.

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";


답변

이것에 대해 생각해보십시오.

int 2d = 42;
double a = 2d;

무엇입니까? 2.0? 또는 42?

힌트, 만약 당신이 그것을 얻지 못하면, 숫자 뒤의 d는 이중 리터럴 이전의 숫자를 의미합니다.


답변

이제는 컨벤션이지만 기술 요구 사항으로 시작되었습니다.

예전에는 FORTRAN이나 BASIC과 같은 언어 파서는 공백을 사용할 필요가 없었습니다. 따라서 기본적으로 다음은 동일합니다.

10 V1=100
20 PRINT V1

10V1=100
20PRINTV1

이제 숫자 접두사가 허용되었다고 가정하십시오. 이것을 어떻게 해석 하시겠습니까?

101V=100

같이

10 1V = 100

또는

101 V = 100

또는

1 01V = 100

그래서 이것은 불법입니다.


답변

컴파일하는 동안 어휘 분석에서 역 추적을 피할 수 있기 때문입니다. 다음과 같은 변수

Apple;

컴파일러는 문자 ‘A’를 만나면 바로 식별자임을 알 수 있습니다.

그러나 다음과 같은 변수는

123apple;

컴파일러는 ‘a’가 될 때까지 숫자 또는 식별자인지 결정할 수 없으므로 결과적으로 역 추적이 필요합니다.


답변

컴파일러 / 파서 / 어휘 분석기는 오래 전에 오래 전에 사용되었지만 컴파일 단위의 숫자 문자가 리터럴인지 식별자인지를 명확하게 결정하는 데 어려움이 있다고 생각합니다.

공간이 중요하지 않은 언어 (ALGOL 및 올바르게 기억하면 원래 FORTRAN과 같은)는 해당 이유로 식별자를 시작하기 위해 숫자를 받아 들일 수 없습니다.

이것은 저장 또는 숫자 기반을 나타내는 특수 표기법 이전으로 거슬러 올라갑니다.


답변

식별자를 숫자로 시작하는 것이 편리하다는 데 동의합니다. 한두 사람이 식별자에 밑줄을 붙여서 이러한 제한을 해결할 수 있다고 언급했지만 실제로는 추악합니다.

문제의 일부는 0xdeadbeef와 같은 숫자 리터럴에서 비롯된 것으로 생각되므로 숫자로 시작할 수있는 식별자 규칙을 기억하기가 어렵습니다. 이를 수행하는 한 가지 방법은 키워드 또는 숫자 리터럴이 아닌 [A-Za-z _] +와 일치하는 항목을 허용하는 것입니다. 문제는 0xdeadpork와 같은 이상한 것들을 허용하지만 0xdeadbeef는 허용하지 않는다는 것입니다. 궁극적으로 우리는 모든 육류에 공정해야한다고 생각합니다.

C를 처음 배울 때 변수 이름에 대한 규칙이 임의적이고 제한적이라는 느낌이 들었습니다. 무엇보다도 그들은 기억하기가 어려워서 배우려고 포기했습니다. 방금 옳은 느낌을 받았고 꽤 잘 작동했습니다. 이제 더 많이 배웠으므로 그리 나쁘지 않고 마침내 올바르게 배우기 시작했습니다.


답변

토큰을 구문 분석 할 때 첫 문자 만보고 식별자 또는 리터럴인지 확인한 후 처리를 위해 올바른 함수로 보내야합니다. 이것이 성능 최적화입니다.

다른 옵션은 리터럴이 아닌지 확인하고 식별자 도메인을 리터럴을 제외한 유니버스로 두는 것입니다. 그러나 이렇게하려면 모든 토큰의 모든 특성을 검사하여 분류 방법을 알아야합니다.

또한 문체 의미 식별자가 니모닉이어야하므로 숫자보다 단어를 기억하기가 훨씬 쉽습니다. 다음 수십 년 동안 스타일을 설정하여 많은 독창적 인 언어가 쓰여졌을 때, 그들은 “2”를 “to”로 대체 할 생각을하지 않았습니다.