2011-12-14 2 views
2

다음은 정의되지 않은 동작을 호출합니까? 좌변 참조 처 오브젝트 타입 T 의 목적은 아니며 유래의 유형의 객체가 아닌 경우 C++ 03불확정 값으로 객체 초기화

(4.1/1)에서

int x; 
int i = x; 

참조 T 또는 개체가 초기화되지 않은이면이 변환이 필요한 프로그램에 정의되지 않은 동작이 있습니다.

편집 : 그러나,에서 (3.3.1/1) 객체가 그 이유는, 자신의 indetermine 값으로 초기화 할 수있다? 즉

int x = x; //not an undefined behaviour 
+0

필자가 사용하는 컴파일러에 달려 있다고 말할 수 있습니다. 그러나 예, 프로그래머의 관점에서 볼 때 정의되지 않은 동작입니다. 보통,'x'와'i' 모두에 쓰레기가 생깁니다. – frarees

+0

@frarees "_it는 컴파일러에 따라 다릅니다."아니요. 뭔가 행동을 정의했는지 여부입니다. – curiousguy

+0

글쎄, 필자는 컴파일러가 정의 될 때'x'에 값 0이 할당되고 값이 할당되지 않는다고 들었 기 때문에 그렇게 말했습니다. 또한,이 경우 나는 행동에 대해 이야기 할 때 마침내 얻는 가치를 언급합니다. – frarees

답변

6

예. 초기화되지 않고 할당되지 않은 변수 (x)의 값을 읽고 있기 때문에 가능합니다.

+0

내 편집을 참조하십시오. – user1086635

+0

@ user1086635 3.3.1이 범위에 관한 것이기 때문에 당신이 말하는 표준의 어떤 부분인지 모르겠다. 그리고 나는/1이 무엇을 의미하는지 모른다. –

+0

3.3.1은 C++ 03에서의 선언 포인트이며/1은 첫 번째 단락입니다. – user1086635

0

완벽하게 정의 된 동작을 호출합니다. 임의의 가비지 값 x가 스택에 할당 될 때 그 값은 그대로 i에 할당됩니다.

그러나 컴파일러에 따라 초기화되지 않은 변수를 참조하는 데 대한 컴파일 시간 경고가 표시 될 수 있습니다.

+2

아니요, 초기화되지 않고 할당되지 않은 변수의 값에 액세스하는 것이 UB입니다. –

+0

@SethCarnegie : 'x'값이 '3'이되면 'i'값이 '3'과 다를 수 있다는 뜻입니까? – Dennis

+1

@Dennis 예 또는 컴파일러가 폭발 할 수 있거나 피자를 주문하거나 다른 일이 발생할 수 있습니다. 표준이 정의되지 않았기 때문에 추측하는 것은 무의미합니다 ._ –

0

인용구에서 말한 것처럼 x이 초기화되지 않은 경우 정의되지 않습니다.

static int x; 
int j = x; 

하지만 예는되지 않습니다 :

int x; // 0 initialized 
int i = x; 

int main() { 
    int z; // not initialized 
    int k = z; // UB 
} 
+0

"내장 _ 유형에 대해 초기화 된 _0_"포옹? – curiousguy

0

기억해야 할 유일한 것은이 괜찮 것입니다.

0

int x = x; // 정의되지 않은 동작이 아닙니다.

잘못된 것입니다.

+0

그들은 표준의 한 예로 이것을 사용합니다. 나는 그것이 그들이 ok를 말하고 있었다는 것을 의미하지 않는다고 생각한다. –

+0

실제로. 나는 어떤 코드를 언급하는 관행을 좋아하지 않으며 코드가 허용되지 않는다는 것을 분명하게 말하지 않는다 ... C++위원회에 연락 할 수있다. – curiousguy