2011-01-07 4 views
22

부울 변수 bool abc;을 클래스에 선언했으며 기본적으로 false가 될 것이라고 생각했습니다. 내 프로그램 if (abc)의 if 조건이 true로 밝혀 졌기 때문에 abc의 값을 출력하고 값 55가 포함 된 것을 보았습니다. 정상입니까? 그것이 틀리다는 것을 확인하기 위해 항상 'bool abc = false'를 지정해야합니까?부울 변수는 기본적으로 항상 false가 아닙니까?

+0

이유 : http://stackoverflow.com/questions/1910832/c-why-arent-pointers-initialized-with-null-by-default/1910992#1910992 –

+0

[초기화되지 않은 변수를 읽는 것은 UB .] (http://stackoverflow.com/questions/4259885/why-do-i-see-strange-values-when-i-print-uninitialized-variables/4259991#4259991) 그냥하지 마십시오. – GManNickG

+1

이 상황에서 나타날 수있는 '재미있는'버그는 b 및! b 모두 true로 평가됩니다. –

답변

19

예, 항상 변수를 초기화해야합니다. 그것이 분명하고 그렇게 할 필요가없는 시대를 친밀하게 배우기 전까지는 무엇이든 항상 그렇게해야합니다. 그리고 그때까지 ... 음 ... 왜 좋은 습관을 그만 두겠습니까? 두 번에 대한 기본 내장 데이터 유형 (부울, 문자, wchar_t를, 짧은, INT, 긴, 플로트를 이야기

struct X 
{ 
    bool b; 
    X() : b() {} 
}; 
+8

나는 명시적인 부울 리터럴을 false로 추가하고 싶습니다. (내게는 읽기 쉽습니다 (기술적으로는 당신과 다르지는 않습니다)). –

21

:

는 그것을 구성 기본값으로 충분한입니다 false로 부울을 초기화하려면 , long double), C++ 표준에 따르면 전역 변수는 명시 적으로 초기화되지 않은 경우 기본값이 0으로 설정됩니다 ().

로컬 변수의 경우 컴파일러가 할당 된 메모리의 내용을 정리할 필요가 없습니다. 로컬 변수는 명시 적으로 초기화되지 않은 경우 임의의 값을 포함합니다.

+5

기술적으로 '정적 저장 기간'의 변수입니다. 전역 변수는이 유형의 변수의 구성원입니다. –

1

예. bool x=false 또는 bool x(false) 중 하나를 수행해야합니다. 초기화되지 않은 프리미티브는 ANY 값을 가질 수 있습니다.

wikipedia

+1

또는'bool x = bool();'도 사용할 수 있습니다. –

1

를 볼 수 있음. 항상 변수를 사용하기 전에 초기화하십시오. 비록 언어가 그들이 특정한 가치를 지니고 있다고 보장하더라도. 당신이 스스로를 강요 할 수 없다면, 불평 할 컴파일러를 얻은 다음 스스로 그렇게하십시오. :)

그러나 은 실제로 초기화 할 의미가없는 경우 값을 초기화하지 않습니다. 이 같은 루프가있는 경우 예를 들어, (나는이 그냥 예입니다, 좋은 코드입니다 말하는 게 아니에요) : 내가했던 것처럼

int i = 0; 
while ((i = getNum()) == 5) 
{ 
} 

제로로 i를 초기화하지 마십시오. 그것은 말이 안되며, 컴파일러를 셧다운하는 동안 잊어 버리고 코드가 엉망이 될 가능성이있다. 올바른 시간에만 초기화하도록 강요 할 수 있다면 더 이상은 아니지만 덜 복잡하지 않을 수도 있습니다. 그러면 wrong code will look wrong even at just a glance부터 디버깅을 훨씬 쉽게 할 수 있습니다.

한 줄로 : 컴파일러가 불평하지 않도록 초기화하지 말고 항상 사용하기 전에 초기화하십시오.

4

기본적으로 전역 변수에만 0 (거짓)이 할당되며 모든 로컬 변수에는 부울 변수에서 true로 평가되는 0이 아닌 가비지 값이 지정됩니다.

관련 문제