itsource

변수 이름에 댓글을 달 수 있나요?

mycopycode 2022. 9. 3. 13:58
반응형

변수 이름에 댓글을 달 수 있나요?

int main()
{
     i/*nt*/a = 10;
     return 0;
}

위의 코드가 있고 토큰을 세고 싶은 경우 14개입니까, 13개입니까?

수수 이이 멘멘 멘멘 멘? ???「 」는, 「 」라고할 수 .int i,int a,int ia글로벌하게 정의되어 있습니다.

코멘트는 프로그램 번역1 단계3에서 삭제됩니다.각 코멘트는 공백 1자로 바뀝니다.그래서 댓글은/*nt*/절대 토큰이 아닙니다.

쪽도 없는 int,main,i,a ★★★★★★★★★★★★★★★★★」return는 전처리 매크로로 정의되며 프로그램을 해석하면 14개의 토큰(13개가 아님)이 생성됩니다.

int main ( ) { i a = 10 ; return 0 ; }

~가 아니면i은, 라고 하는 으로 정의됩니다.typedef 구문 . 구문 는 "알겠습니다", "알겠습니다"입니다.i a는 C문법의 규칙과 일치하지 않습니다.

따라서 변수 이름 안에 코멘트를 쓸 수 없습니다.코멘트는 식별자를 2개의 토큰으로 분할합니다.이는 모든 전처리 및 C 언어2 토큰에 적용됩니다.

, 와 그 , 단항 연산자와 피연산자 할 수 .#그 「」를 참조해 주세요.

/**/#/**/include/**/<stdio.h>/**///////////////////////
/**/#/**/define/**/STAT/**/(/**/a/**/)/**/-/**/1/**////
/**/#/**/ifdef/**/STAT/**//////////////////////////////
/**/int/**/main/**/(/**/)/**/{/**//////////////////////
/**/int/**/a/**/=/**/+/**/1/**/;/**////////////////////
/**/printf/**/(/**/"Hello "/**/"world!\n"/**/)/**/;/**/
/**/return/**/STAT/**/;/**/////////////////////////////
/**/}/**///////////////////////////////////////////////
/**/#/**/endif/**//////////////////////////////////////

합니다.STAT로 to to to to ( a ) - 1.

변수 이름은 다른 토큰과 마찬가지로 이스케이프된 줄바꿈으로 분할할 수 있습니다.이스케이프된 또는 """입니다.\이치이러한 시퀀스는 프로그램 변환 단계2에서 소스 코드에서 삭제됩니다.그 주된 목적은 긴 매크로 정의를 여러 줄에 걸쳐 깨는 것입니다.

다음은 동일한 14개의 토큰을 생성하는 코드3 프래그먼트입니다.

\
i\
nt\
 ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
 0;}

코드 컬러라이저가 sliced 키워드와 diceed 키워드를 놓치고 코멘트를 남겼다는 점에 주의해 주세요.


1) 이 동작은 ANSI-C, 일명 C89에서 규정되어 있습니다.일부 고대 컴파일러는 토큰 붙여넣기를 일으키는 미묘하게 다른 행동을 보였지만, 이러한 특성은 역사적 관심사일 뿐입니다.

2)가 프로그램되어 있는 할 수 . 2) 문자열 상수는 6단계입니다.printf("Hello "/* my name is Luca */"world!\n");

3) 이 Christmas Tree 프레젠테이션 스타일은 실제 프로그램에서 사용하는 것이 아니라 C의 입력 처리 능력을 남용하는 방법을 보여줍니다.더 정교한 트릭이 국제 난독화 C 코드 콘테스트에서 우승했습니다.

어휘적 관점에서 주석은 공백과 같다.

어휘적 요소에 관한 C 표준의 섹션 6.4p3:

... 토큰의 전처리는 공백으로 나눌 수 있습니다.이것은 주석(나중에 설명) 또는 공백 문자(스페이스, 수평 탭, 줄 바꿈, 수직 탭 및 폼 피드)로 구성됩니다.

구체적으로는 코멘트는 1개의 공간으로 변환됩니다.이것은 섹션 5.1.1.2p3에 규정되어 있습니다.

소스 파일은 전처리 토큰 및 공백 문자 시퀀스(댓글 포함)로 분해됩니다.소스 파일은 부분적인 전처리 토큰 또는 부분적인 코멘트로 끝날 수 없습니다.각 코멘트는 공백 문자 1개로 바뀝니다.새 행 문자가 유지됩니다.공백이 아닌 공백 문자의 각 시퀀스를 줄바꿈 이외의 공백 문자로 유지할지 또는 공백 문자 1개로 대체할지 여부가 구현 정의됩니다.

이를 설명하기 위해 코드를 프리프로세서에 전달하면 다음과 같이 표시됩니다.

  int main()
  {
       i a = 10;
       return 0;

  }

따라서 공백과 마찬가지로 코멘트는 토큰을 분리하는 역할을 합니다.

즉, 코드에는 13개의 토큰이 아닌 14개의 토큰이 포함됩니다.

결과는 다음과 같습니다.

i a = 10;

제외:

ia = 10;

번역(컴파일) 단계 3, 스텝 2: "각 코멘트는 공백 문자로 대체됩니다."를 참조하십시오.

그래서 개념적으로i/*nt*/a된다i a그 시점에서.

당신의 코드 조각이 어떤 형태인지 확인하세요.

     int main()
    {
        int i/*nt*/a = 10;
        return 0;
    }

전처리 후 갖게 됩니다.컴파일러 gcc - E myscript.c에 "-E" 플래그를 추가하면 다음과 같은 결과를 얻을 수 있습니다.

e.sharaborin@landau:~$ gcc -E myscript.c
# 1 "myscript.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "myscript.c"
int main()
{
    int i a = 10;
    return 0;
}

그리고 분명히, 당신은 실수가 있다고 결론지을 수 있습니다.

언급URL : https://stackoverflow.com/questions/63609077/can-we-write-comments-within-variable-names

반응형