정의되지 않은 동작: cout 이해 << << a
C에서는 정의되지 않은 동작의 개념을 이해하는 것이 중요합니다. 정의되지 않은 동작은 프로그램의 동작이 C 표준에 지정되지 않아 예측할 수 없는 결과를 초래하는 상황을 의미합니다.
다음 설명을 고려하세요.
cout << a++ << a;
여기서 시퀀스가 있습니다. 증가 연산자( )와 삽입 연산자(<<)를 포함하는 연산입니다. 이러한 연산을 변수 a에 적용할 때 시퀀스 포인트가 없기 때문에 정의되지 않은 동작이 발생합니다.
시퀀스 포인트는 컴파일러가 모든 부작용이 발생했음을 보장하는 코드의 특정 지점입니다. 그러나 위의 설명에서는 a와 a의 평가 사이에 시퀀스 포인트가 없습니다. 이는 이러한 작업이 수행되는 순서가 표준에 지정되어 있지 않음을 의미합니다.
따라서 이 문의 출력은 구현에 따라 달라질 수 있습니다. 어떤 경우에는 출력이 "01"일 수도 있고 다른 경우에는 "10"일 수도 있습니다. 그러나 표준은 어떤 경우가 발생할지 보장하지 않으므로 동작이 정의되지 않습니다.
C 17 업데이트
C에서 표현식 평가를 관리하는 규칙에 유의하는 것이 중요합니다. C 17에서 업데이트되었습니다. C 17에서는 <<와 같은 시프트 연산자 표현식에 다음 규칙이 적용됩니다. >>:
"교대 연산자 표현식 E1<
이 규칙은 원래 문에서 정의되지 않은 동작을 제거합니다. C 17에서는 cout << << 에이; a의 평가 이전에 a의 부작용(a 증가)이 발생하는 것이 보장되므로 항상 "01" 출력을 생성합니다.
위 내용은 왜 `cout인가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!