a = 0, b = a++, c = a++의 정의가 C에 정의된 동작을 가지고 있습니까?
가 .int a = 0, b = a++, c = a++;
C에서 행동을 정의했습니까?
또는 이와 거의 동일하게 객체 정의의 쉼표가 식의 쉼표 연산자에 대한 시퀀스 포인트를 도입합니까?
C++에 대해서도 비슷한 질문이 제기되었습니다.
C++에 대해 널리 인정되는 답변은 예, C++11 표준의 8/3항에 따라 완전히 정의됩니다.
선언문의 각 init-declarator는 마치 선언문에 있는 것처럼 별도로 분석됩니다.
비록 이 단락은 구문 분석 단계만을 언급할 뿐이고 런타임 시 연산 순서에 대해 충분히 정확하지는 않습니다.
C 언어의 상황은 어떻습니까?C 표준이 행동을 정의하고 있습니까?
이전에도 비슷한 질문이 있었습니다.
여러 개체에 대한 선언에서 쉼표는 쉼표 연산자와 같은 시퀀스 포인트를 도입합니까?
그러나 답변은 C11 초안을 구체적으로 언급하는 것으로 보이며, C11 초안 이후 정보를 제공하는 부속서 C의 문구가 변경되었고 표준 문서와 완전히 일치하지 않는 것으로 보이기 때문에 C 표준의 더 최근 버전에 대한 답변은 유지되지 않을 수 있습니다.
편집: 물론 그러한 초기화기는 쓸모없이 뒤틀려 보입니다.저는 그러한 프로그래밍 방식과 구성을 절대 용납하지 않습니다.질문은 사소한 정의에 대한 논의에서 비롯되었습니다.int res = 0, a = res;
동작이 완전히 정의되지 않은 것으로 보이는 경우(!). 드물지 해 보십시오. 예를 들어 다음과 같은 것을 생각해 보십시오.int arg1 = pop(), arg2 = pop();
가 .
int a = 0, b = a++, c = a++;
C에서 행동을 정의했습니까?
예. C 2018 6.83에 따르면 이러한 초기화(모든 것은 아님, 아래 참조)는 나타나는 순서대로 평가됩니다.
… 자동 저장 지속 시간을 갖는 객체들의 초기화기들 및 블록 범위를 갖는 통상적인 식별자들의 가변 길이 배열 선언기들은, 다음과 같이, 선언이 실행 순서에 도달할 때마다 그 값들이 객체들(초기화기가 없는 객체들에 불확정한 값을 저장하는 것을 포함함)에 저장되는 것을 특징으로 하는 방법.그것이 선언문이라면, 그리고 선언자들이 나타나는 순서대로 각 선언문 안에.[강조가 더해짐.]
또한 6.84는 각 이니셜라이저가 완전식이고 완전식 평가 후 시퀀스 포인트가 존재하며 다음을 평가합니다.
전체 표현식은 다른 표현식의 일부도 아니고 선언자 또는 추상 선언자의 일부도 아닌 표현식입니다.또한 가변 수정된 유형에 대한 일정하지 않은 크기 식을 평가하는 암시적 전체 식을 사용합니다. 이 전체 식을 사용하면 서로 다른 크기 식을 평가하는 순서가 없습니다.완전식의 평가와 평가할 다음 완전식의 평가 사이에는 순서점이 있습니다.
위의 두 가지를 모두 고려할 때, 초기화자는 나타나는 순서대로 배열됩니다.a
때 이 있습니다.a++
됩니다에 대해 됩니다.b
은 됩니다 됩니다.a++
위해서c
시작하므로 전체 선언은 6.52의 "순차없는 효과" 규칙으로부터 안전합니다.
6.83은 두 가지 이유로 약간 부족합니다.
- 이니셜라이저는 문법 토큰 선언자의 일부가 아닙니다(이들은 선언자의 토큰을 포함하는 init-declarator의 일부입니다).하지만 이것은 문구상의 문제로 보이며, 우리는 이니셜자를 그들의 선언문과 연관시킬 수 있습니다.
- 선언기의 식(예: 가변 길이 배열의 크기)과 초기화자 사이의 순서를 지정하지 않습니다.
또한 모든 이니셜라이져가 선언문에 나타나는 순서대로 평가되는 것은 아닙니다. 6.7.923에서는 Aggregate 및 Union의 이니셜라이져에 대해 논의하고 다음과 같이 말합니다.
초기화 목록 표현식의 평가는 서로에 대해 불확정적으로 순서가 결정되므로 부작용이 발생하는 순서는 지정되지 않습니다.
역사
위에서 인용한 6.83의 문구는 C 1999년으로 거슬러 올라갑니다.C 1990년에는 6.6.2에서 이와 같은 형태를 띠었는데, 이는 복합문에 관한 것입니다.
… 자동 저장 기간을 가진 개체의 초기화자를 평가하고 개체의 선언자가 변환 단위에 나타나는 순서대로 값이 개체에 저장됩니다.
"a = 0, b = a++, c = a++의 정의가 C에 정의된 동작을 가지고 있습니까?"...
현재 C 표준 ISO/IEC9899:2017에서 프로그램 실행은 시퀀싱 및 부작용에 대한 논의를 포함하는 섹션 §5.1.2.3 (3)에서 다루고 있습니다.참조를 위해 소스 텍스트가 아래에 재생됩니다.
아래 텍스트 섹션에서 요약하면 선언문의 이니셜라이제이션이 순서화되어 선언문의 이니셜라이제이션이 게시됨을 보장합니다...
int a = 0, b = a++, c = a++;
여기서 "...init-declarator-list []는 쉼표로 구분된 선언자 시퀀스이다"(섹션 6.7 선언)
...정의되지 않은 동작을 호출하거나 결과를 확인할 수 없습니다.쉼표로 구분된 각 식은 왼쪽에서 시작하여 현재 식에 대한 모든 평가 및 부작용이 해결되고 완료될 때까지 오른쪽으로 이동하지 않도록 보장됩니다.이런 식으로 각 식의 결과가 완전히 정의됩니다.
§5.1.2.3부터
"이전에 시퀀싱된 것은 단일 스레드에 의해 실행되는 평가 간의 비대칭적, 전이적, 쌍대적 관계이며, 이는 해당 평가 간에 부분적인 순서를 유도합니다.A와 B의 두 평가가 주어졌을 때, A가 B보다 먼저 순서가 정해지면, A의 실행은 B의 실행보다 선행되어야 합니다. (반대로, A가 B보다 먼저 순서가 정해지면, B는 A 다음에 순서가 정해집니다.)A가 B 이전 또는 이후에 시퀀싱되지 않으면 A와 B는 시퀀싱되지 않습니다.평가 A 및 B는 A가 B 이전 또는 이후에 순서화될 때 불확정적으로 순서화되지만 어느 것인지는 특정되지 않습니다.13) 식 A 및 B의 평가 사이에 순서화 포인트가 존재한다는 것은 A와 관련된 모든 값 계산 및 부작용이 모든 값 계산 및 부작용과 관련된 모든 값 계산 이전에 순서화됨을 의미합니다.B. (서열 포인트의 요약은 부속서 C에 수록되어 있습니다.)
부속문서 C에 제공된 관련 단락:
"다음은 5.1.2.3에 설명된 시퀀스 포인트입니다."+ (3)...
"완전한 표현의 평가와 평가될 다음 완전한 표현 사이. 다음은 완전한 표현식: 가변 수정된 형식에 대한 완전한 선언자; 복합 리터럴의 일부가 아닌 초기화자(6.7.9); 표현식 문장의 표현(6.8.3); 선택 문장의 제어식(if 또는 switch); 잠시 또는 두 문장의 제어식(6.8.5); 각각의 표현식 (선택사항) for문의 표현 (6.8.5.3); 반환문의 (선택사항) 표현 (6.8.6.4)."
산)
그냥 그런 짓 하지 마...그것은 재앙의 처방입니다...아니, 하지마. 완전 정지.
언급URL : https://stackoverflow.com/questions/76867659/does-the-definition-int-a-0-b-a-c-a-have-defined-behavior-in-c
'bestsource' 카테고리의 다른 글
C 휘발성 변수와 캐시 메모리 (0) | 2023.10.01 |
---|---|
C에서 전역 변수는 항상 0으로 초기화됩니까? (0) | 2023.10.01 |
front end or back end의 api 오류 메시지 국제화? (0) | 2023.10.01 |
VARCHAR(255)가 다른 길이와 달리 자주 사용되는 이유가 있습니까? (0) | 2023.10.01 |
속성당 WooCommerce 스톡 (0) | 2023.10.01 |