문제

이 코드 스 니펫 1 을 발견했습니다. 라코 디스

1 : 이것은 실제 사례가 아닙니다.

제 질문은 " 코드 스 니펫의 동작이 C 및 C ++에서 잘 정의되어 있습니까? "입니다.

내 의견 :

C에서는 6.5.17가 말하기 때문에 동작이 잘 정의되어 있습니다. <인용구>

쉼표 연산자의 왼쪽 피연산자는 void 표현식 으로 평가됩니다. 평가 후 시퀀스 포인트가 있습니다

C ++ 03에서는 5.18가 말하고 있기 때문에 동작이 잘 정의되어 있습니다. <인용구>

쉼표로 구분 된 한 쌍의 표현식은 왼쪽에서 오른쪽으로 평가되고 왼쪽 표현식의 값은 버려집니다 .

하지만 C ++ 03 (6.6.3 섹션)에서도 다음과 같이 말합니다. <인용구>

함수 끝에서 흘러 나오는 것은 값이없는 반환과 같습니다. 이로 인해 값 반환 함수에서 정의되지 않은 동작이 발생합니다.

C와 유사 <인용구>

제어가 무효가 아닌 기능 (} 제외)의 끝 (main())에 도달하면 동작이 정의되지 않습니다.

따라서이 모든 점을 고려하면 실제 행동을 판단 할 수 없습니다. 사람들은 어떻게 생각하세요?

P.S : 질문이 쓸모 없다고 생각하고 더 나은 일이 있다면 스스로 도와주세요. D.

도움이 되었습니까?

해결책

내가 보유한 C 사양 (C99 TC3)에 따르면 <인용구>

함수를 종료하는}에 도달하고 호출자가 함수 호출의 값을 사용하면 동작이 정의되지 않습니다.

"무효 표현식으로 평가"된다고하는 표현식의 값은 삭제됩니다.따라서 C의 경우 정의되지 않은 동작이 없습니다.이전 C에서는 다를 수 있습니다 (올바르게 기억하는 경우 일부 세부 정보).

C ++의 상황은 C의 경우와 약간 다릅니다. C ++는 생성자 및 소멸자를 반환 값으로 사용하는 클래스 개체를 지원하고 초기화되지 않은 메모리에서 작동하도록하는 것이 제대로 작동한다고 보장 할 수 없기 때문입니다.아마도 이것은 C ++에 대한 다른 규칙에 기여했을 것입니다.

다른 팁

정의되지 않은 동작입니다.

왼쪽 표현식을 평가하면 반환없이 값을 반환하는 함수의 끝에서 흘러 나옵니다.값이 폐기되었다고해서 평가가 수행되지 않은 것은 아닙니다.

분명히 정의되지 않았습니다.C99 §6.3.2.2는 "(부작용에 대해 void 표현식이 평가됩니다.)"라고 말합니다. 따라서 함수가 평가되고 끝까지 흘러갑니다.탈옥 카드가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top