컴파일러는 함수 호출의 쉼표가 쉼표 연산자가 아님을 어떻게 알 수 있습니까?
호출 함호호을다니고려합출수출alling호▁(c다▁consider▁call을▁the▁function)을 생각해 보세요.int sum(int, int))
printf("%d", sum(a,b));
컴파일러는 어떻게 결정합니까?, 호출에 됩니다.sum(int, int)쉼표 연산자가 아닙니까?
참고: 함수 호출에 실제로 쉼표 연산자를 사용하고 싶지 않았습니다.컴파일러가 콤마 연산자가 아니라는 것을 어떻게 알고 있는지 알고 싶었습니다.
C 언어의 문법을 보세요.그것은 표준의 부록 A에 전체적으로 나열되어 있습니다.작동 방식은 C 프로그램의 각 토큰을 단계별로 살펴보고 문법의 다음 항목과 일치시킬 수 있습니다.각 단계에서 사용자는 제한된 수의 옵션만 사용할 수 있으므로 지정된 문자의 해석은 해당 문자가 표시되는 컨텍스트에 따라 달라집니다.문법의 각 규칙 내에서 각 행은 프로그램이 일치하도록 유효한 대안을 제공합니다.
특히, 만약 당신이 찾는다면.parameter-list명시적인 쉼표가 포함되어 있는 것을 볼 수 있습니다.따라서 컴파일러의 C 파서가 "매개 변수 목록" 모드에 있을 때마다 찾은 쉼표는 쉼표 연산자가 아닌 매개 변수 구분 기호로 이해됩니다.괄호도 마찬가지입니다(식에서 발생할 수 있음).
이것은 효과가 있습니다 왜냐하면parameter-list규칙은 사용에 주의해야 합니다.assignment-expression한 규칙이 규칙expression. 규칙. 규칙.expression할 수 를포수있반면는할함표쉼,,▁an면▁can표▁commas반▁contain,assignment-expression 목록했을 때 입니다.그렇지 않으면 문법이 모호할 것이고 컴파일러는 매개 변수 목록 내에서 콤마를 발견했을 때 무엇을 해야 할지 모를 것입니다.
그러나, 예를 들어, 함수 정의/호출의 일부가 아닌 오프닝 브래킷 또는if,while또는for옵션은이 그 ). 그 문, 는다일해로것다입니석될부식 (의옵션없때이기, 에그러인선경만에우택유한효식시나서시의그작문이에점른다▁statement,만▁will▁the에,(다▁the▁be경우▁if▁brackets인선because,택▁interpre▁there,입문▁as▁theion그ted▁and▁(▁part,러▁option▁then니▁at한▁of것▁an▁express유효▁but식▁inside될석부▁point나▁choice), 그리고 괄호 안에,expression구문 규칙이 적용되고 쉼표 연산자가 허용됩니다.
C996.5.17부터:
구문에 표시된 대로 쉼표 연산자(이 하위 절에 설명된 대로)는 목록의 항목(예: 함수에 대한 인수 또는 이니셜라이저 목록)을 구분하는 데 사용되는 컨텍스트에 표시될 수 없습니다.반면에, 이러한 맥락에서 괄호가 있는 표현식 또는 조건 연산자의 두 번째 표현식 내에서 사용할 수 있습니다.함수 호출에서
f(a, (t=3, t+2), c)함수에는 세 개의 인수가 있으며, 두 번째 인수는 값이 5입니다.
또 다른 유사한 예는 배열 또는 구조체의 초기화자 목록입니다.
int array[5] = {1, 2};
struct Foo bar = {1, 2};
함수 매개변수로 쉼표 연산자를 사용할 경우 다음과 같이 사용합니다.
sum((a,b))
물론 이것은 컴파일되지 않습니다.
그 이유는 C 문법 때문입니다.다른 모든 사람들이 이 예를 인용하기를 좋아하는 것처럼 보이지만, 실제 거래는 표준(C99)의 함수 호출에 대한 구문 구조 문법입니다.네,은 예, 함호출다같구다로 구성되어 .()포스트픽스 식에 적용되는 연산자(예: 식별자):
6.5.2 postfix-expression:
...
postfix-expression ( argument-expression-list_opt )
와 함께
argument-expression-list:
assignment-expression
argument-expression-list , assignment-expression <-- arglist comma
expression:
assignment-expression
expression , assignment-expression <-- comma operator
쉼표 연산자는 식에서만 발생할 수 있습니다. 즉, 문법에서 더 아래쪽에 있습니다.따라서 컴파일러는 함수 인수 목록의 쉼표를 하나의 분리된 표현식이 아닌 할당식을 분리된 표현식으로 취급합니다.
기존 답변은 "C 언어 사양이 연산자가 아닌 목록 구분자라고 하기 때문"이라고 말합니다.
그러나 당신의 질문은 "어떻게 컴파일러가..."를 알고 있는지 묻는 것이며, 그것은 완전히 다릅니다.컴파일러가 쉼표를 인식하는 것과 전혀 다르지 않습니다.printf("Hello, world\n");쉼표 연산자가 아닙니다.컴파일러는 콤마가 나타나는 문맥 때문에 '알고 있다' - 기본적으로, 이전에 무엇이 갔는지.
C '언어'는 BNF(Backus-Naur Form)로 설명할 수 있습니다. 기본적으로 컴파일러의 파서가 입력 파일을 검색하는 데 사용하는 규칙 집합입니다.C에 대한 BNF는 언어에서 쉼표의 발생 가능성이 있는 이러한 서로 다른 항목을 구별합니다.
컴파일러가 작동하는 방법과 컴파일러를 작성하는 방법에 대한 좋은 리소스가 있습니다.
초안 C99 표준은 다음과 같습니다.
구문에 표시된 대로 쉼표 연산자(이 하위 절에 설명된 대로)는 목록의 항목(예: 함수에 대한 인수 또는 이니셜라이저 목록)을 구분하는 데 사용되는 컨텍스트에 표시될 수 없습니다.반면에, 이러한 맥락에서 괄호가 있는 표현식 또는 조건 연산자의 두 번째 표현식 내에서 사용할 수 있습니다.에서 함수호서에출을 합니다.
f(a, (t=3, t+2), c)함수에는 세 개의 인수가 있으며, 두 번째 인수는 값이 5입니다.
다시 말해서, "왜냐하면"."
이 질문에는 여러 가지 측면이 있습니다.한 가지는 정의가 그렇게 말하고 있다는 것입니다.컴파일러는 이 쉼표가 어떤 컨텍스트에 있는지 어떻게 알 수 있습니까?그것은 파서의 일입니다.특히 C의 경우 LR(1) 파서(http://en.wikipedia.org/wiki/Canonical_LR_parser) 를 통해 언어를 구문 분석할 수 있습니다.
이 방법은 파서가 파서의 가능한 상태를 구성하는 테이블 집합을 생성하는 것입니다.특정 상태에서는 특정 기호 집합만 사용할 수 있으며, 다른 상태에서는 기호의 의미가 다를 수 있습니다.파서는 앞의 기호 때문에 함수를 구문 분석하고 있음을 알고 있습니다.따라서 가능한 상태에는 쉼표 연산자가 포함되지 않습니다.
저는 여기서 매우 일반적이지만, 여러분은 위키에서 모든 세부사항을 읽을 수 있습니다.
언급URL : https://stackoverflow.com/questions/17383492/how-does-the-compiler-know-that-the-comma-in-a-function-call-is-not-a-comma-oper
'IT' 카테고리의 다른 글
| 도커 작곡 라라벨은 데이터베이스가 로딩되기를 기다리는 방법은 무엇입니까? (0) | 2023.07.22 |
|---|---|
| 마이크로서비스 아키텍처에서 마이크로서비스 간에 Java 모델을 공유하는 방법 (0) | 2023.07.22 |
| 어레이의 첫 번째 요소를 가져오고 Aggregate를 사용하여 반환하시겠습니까? (0) | 2023.07.17 |
| logging.info 이 콘솔에 표시되지 않지만 경고 및 오류가 나타납니다. (0) | 2023.07.17 |
| tslint가 모듈을 허용하지 않는 것이 권장되는 이유는 무엇입니까? (0) | 2023.07.17 |