C 및 C ++ 표준에서 "표현식"의 정의

자비로운 신

이 질문은 C 및 C ++ 코스 자료를 업데이트하고 있으며 과거 학생들이 그것에 대해 물어 보았 기 때문에이 질문을하고 있습니다.

ISO / IEC 9899 : 2017 섹션 6.5 표현식 ¶1 (C ++ 표준에서도 유사) :

" 표현식 은 값의 계산을 지정하거나 객체 또는 함수를 지정하거나 부작용을 생성하거나 이들의 조합을 수행하는 연산자 및 피연산자의 시퀀스입니다.…"

표준 작성자는 분명히 단어를 신중하게 선택하기 때문에 "연산자와 피연산자의 시퀀스"라는 문구를 사용하는 것이 잠재적으로 오해의 소지가있는 것 같습니다. 표현식으로 간주 되려면 둘 이상의 연산자와 하나 이상의 피연산자가 있어야 함을 나타내는 것 같습니다. 따라서 123과 같은 리터럴이나 XYZ와 같은 변수는 연산자가 없기 때문에 표현식으로 간주되지 않으며 연산자가 없으면 피연산자로 간주 될 수 없습니다.

그러나 123과 XYZ가 실제로 표현식 인 경우 "연산자 및 피연산자의 시퀀스"라는 구문을 "하나 이상의 문자 시퀀스"또는 이와 유사한 것으로 대체하는 것이 더 정확하지 않을까요?

표준에 명시된 내용에 대해 내가 잘못 해석하고있는 부분을 알려주십시오.

키스 톰슨

예, C 표준에서 "표현"의 정의는 불완전하지만 실제 문제를 일으키는 방식은 아닙니다 (나처럼 까다로운 사람 제외).

인용 한 텍스트의 "표현식"이라는 단어는 이탤릭체로되어 있으며 이는 용어의 공식적인 정의임을 의미합니다. 123예를 들어 표준의 다른 부분 에서는 표현식이라는 것이 분명합니다. 십진수 상수 , 정수 상수 , 상수 , 1 차 표현식 `, 접미사 표현식 , (여러 단계 건너 뛰기)는 표현식 입니다.

"연산자 및 피연산자의 시퀀스" 아닙니다 . 연산자 123가 없습니다. 이는 피연산자가 아님 을 의미합니다 ( 표준의 다른 곳에서 연산자피연산자 의 정의를 참조하여 설명 할 수 있음 ).

실제로이 불완전한 정의로 인해 실제로 어려움을 겪고있는 컴파일러 구현 자나 C 프로그래머 중 누구라도 들어 본 적이 없습니다. 컴파일러 구현자는 언어 문법을 참조합니다. C 프로그래머는 표준을 읽기 전에 "표현식"이 무엇인지 꽤 잘 알고있을 것입니다.

표준의 새 버전에서 업데이트 된 표현 의 정의를보고 싶습니다 . 영어 설명을 시도하는 대신 문법을 참조하는 정의는 IMHO가 개선 될 것입니다.

그러나 업데이트되지 않으면 우리 모두 문제없이 표현식을 계속 사용할 것입니다.

C ++의 경우 Nicol Bolas의 대답 은 C ++ 표준이 C 표준처럼 "표현식"에 대한 공식적인 정의가 없다는 것을 올바르게 지적합니다. 절 8의 맨 위에 유사한 표현이 있습니다. "표현식은 계산을 지정하는 연산자 및 피연산자의 시퀀스입니다." -그러나 "표현"이라는 단어는 이탤릭체가 아니고 그 문장은 "노트"의 일부이므로 비표준입니다. C ++에서 표준은 식을 구문 적으로 정의합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C의 + (+ k--) 표현식

분류에서Dev

C ++ 표현식 SFINAE 및 ostream 조작기

분류에서Dev

C ++ for-loop 업데이트 표현식의 할당 표현식

분류에서Dev

C의 컴파일러 오류, 오류 : 예상 표현식

분류에서Dev

co_await 표현식의 C ++ 코 루틴 임시

분류에서Dev

D의 정적 if 표현식?

분류에서Dev

Swift의 정규 표현식

분류에서Dev

C ++ 17의 새 표현식 평가 순서

분류에서Dev

@Document 주석의 MongoDB 및 SpEL 표현식

분류에서Dev

C ++ 포인터 표현식 및 배열

분류에서Dev

C # 정규 표현식 부정 예측

분류에서Dev

Php의 정규 표현식 (. *?)

분류에서Dev

float 및 int 표현에서 c의 표현식을 평가할 때 다른 값이 있습니까?

분류에서Dev

C의 다중 표현식 매크로

분류에서Dev

C ++의 표현식에서 직접 정규식 캡처 사용

분류에서Dev

Vim의 정규 표현식

분류에서Dev

GWT의 정규 표현식

분류에서Dev

c의 매크로에 대한 인수로서의 산술 표현식

분류에서Dev

Ruby to C # 표현식

분류에서Dev

수학 공식의 C ++ 수학 표현식

분류에서Dev

C ++ 표현식에서 후행 스트림 조작자의 의미

분류에서Dev

C ++ 및 이중 백 슬래시의 정규식 표현식

분류에서Dev

Action <Action <string, int >> 및 C #의 Lambda 표현식

분류에서Dev

grep의 정규 표현식

분류에서Dev

C의 스택, 'int'앞에 예상되는 표현식

분류에서Dev

Racket의 정규 표현식

분류에서Dev

C ++의 case 표현식이 오류를 반환합니다.

분류에서Dev

삭제 표현식과 관련하여 C ++의 "placement delete"부족

분류에서Dev

C ++에서 표현식의 의미 얻기