>백엔드 개발 >C++ >Lvalue-Rvalue 변환으로 인해 C에서 `int x = x;` 정의되지 않은 동작이 발생합니까?

Lvalue-Rvalue 변환으로 인해 C에서 `int x = x;` 정의되지 않은 동작이 발생합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-28 21:31:17188검색

Is `int x = x;` Undefined Behavior in C   Due to Lvalue-to-Rvalue Conversion?

초기화 및 lvalue-rvalue 변환

제공된 코드 조각은 C에서 일반적으로 논의되는 문제를 제기합니다. int x = x;에서와 같이 변수 자체를 초기화하려면 lvalue에서 rvalue로의 변환이 필요합니다. 오른쪽 'x'가 초기화되지 않은 값이고 초기화되지 않은 값에 대한 lvalue-rvalue 변환이 일반적으로 금지되어 있다는 점을 고려하면 이 변환이 정의되지 않은 동작(UB)으로 이어지는지 의문이 생깁니다.

예상되는 lvalue-rvalue 변환의 증거

C 11 표준에는 값 범주에 대한 명시적인 사양이 부족하지만 언어 구조에서 예상되는 상황에 따르면 rvalue는 기본 기대값이 되도록 의도된 것입니다.

  • 내장 연산자는 지속적으로 prvalue 피연산자를 요구하고 필요한 경우 lvalue에서 rvalue로의 변환을 명시적으로 언급합니다.
  • 참조 초기화는 객체에 대해 lvalue에서 rvalue로의 변환이 예상됨을 의미합니다. 초기화.

초기화 변환에 적용

내장 연산자의 동작과 유사하게 복사 초기화도 다음을 기대한다고 가정하는 것이 합리적입니다. prvalue를 초기화자로 사용합니다. 이 가정은 다음에서 더욱 뒷받침됩니다.

  • 표준에서는 이니셜라이저 표현식을 대상 유형으로 변환하기 위해 표준 변환을 사용하는 것을 강조합니다.
  • lvalue-rvalue 변환을 수행하면 올바른 값이 가능해집니다. lvalue 이니셜라이저를 사용하여 변수를 초기화합니다.
  • 사용자 정의 변환이 없다는 점은 값 범주 변환이 Standard.

코드 조각에 대한 의미

복사 초기화에서 prvalue가 필요하다는 가정하에 코드 조각 int x = x; 실제로 UB로 이어질 것입니다. 이는 오른쪽 'x'가 초기화되지 않은 lvalue이고 lvalue에서 rvalue로 변환하면 불확실한 값이 발생하기 때문입니다.

추가 증거

제안된 결함 보고서는 불확실한 값을 가진 개체에 대한 lvalue-rvalue 변환으로 인해 UB가 발생한다는 점을 명확히 해야 한다는 점을 강조합니다. 이 제안된 변경 사항은 복사 초기화가 그러한 변환을 허용해서는 안 된다는 개념을 더욱 뒷받침합니다.

결론

사용 가능한 증거에 따르면 int x = 엑스; 초기화되지 않은 'x'에 대한 lvalue에서 rvalue로의 변환이 금지되므로 C에서 UB를 구성합니다. 그러나 표준에는 기대 가치 범주에 대한 명확한 사양이 부족하여 지속적인 논쟁의 여지가 있다는 점에 유의하는 것이 중요합니다.

위 내용은 Lvalue-Rvalue 변환으로 인해 C에서 `int x = x;` 정의되지 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.