2010-07-21 4 views
0

에서 재사용의 내가 무심코 쓴 다음 코드 조각을 살펴 보자 : 이제C는 ++ : float 값은 반복

void test(){ 
for (int i = 1; i <=5; ++i){ 
    float newNum; 
    newNum +=i; 
    cout << newNum << " "; 
} 
} 

, 이것은 내가 내 머리에 무슨 일이 있었는지입니다 : 난 항상 플로트 생각되었다 newNum은 루프 내에 루프가 있기 때문에 각 반복마다 새로운 값을 가진 newNum이라는 새 변수를 만듭니다. 그리고 부터 float newNum은 컴파일 오류를 발생시키지 않으므로 C++은 일부 기본값 (huhm, 반드시 0이어야 함)을 지정해야합니다. 나는 그 결과를 "1 2 3 4 5"로 예상했다. 인쇄 된 것은 "1 3 6 10 15"입니다.

float newNum은 반복 할 때마다 새로운 변수가 생성된다는 사실을 알고 계십니까?

Btw, Java에서이 코드 조각은 으로 컴파일되지 않습니다. newNum은 초기화되지 않았으며 예상 출력을 얻으려면 0으로 설정해야한다는 것을 알고 있기 때문에 아마 좋을 것입니다.

+0

고마워, guy, esp. 베드로. 이 경우 C++은 var를 0으로 초기화해야한다고 생각하거나 컴파일러가 불평합니다. 프로그래머에게 친숙 할 것이다. D. –

+0

출력을 1,2,3,4,5로하려면 newNum ++를 사용해야합니다. 이제는 매번 newNum에 i를 추가하고 있습니다! 그리고 물론 초기화되어야하며 다른 모든 대답도 말해야합니다! –

답변

6

newNum은 명시 적으로 초기화되지 않으므로 적어도 첫 번째 반복에서는 임의의 값 (할당 된 메모리 블록에 포함 된 가비지 데이터로 결정됨)을 갖습니다.

후속 반복에서는 일 수 있습니다.은 이전 값이 재사용 될 수 있습니다 (컴파일러가 동일한 메모리 위치에 반복적으로 할당 할 수 있기 때문에 이것은 전적으로 컴파일러의 재량에 달려 있습니다). 결과에서 볼 때, 실제로 여기에서 일어난 일입니다. 첫 번째 반복에서 newNum은 값 0 (순수한 기회에 의해)을 가졌고, 각각 1, 3, 6 및 10이었습니다.

그래서, 원하는 출력을 얻을 수있는 루프 내에서 명시 적으로 변수를 초기화 :

float newNum = 0.0; 
1

는 작성중인 플로트는 전혀 초기화되지 않습니다. 당신이 운이 좋았던 것처럼 보이고 첫 번째 패스에서 0으로 판명되었지만 아무런 가치가 없었을 수도 있습니다.

루프가 반복 될 때마다 새로운 플로트가 생성되지만 마지막 플로트와 동일한 비트의 메모리가 사용되므로 기존 값으로 끝납니다.

원하는 효과를 얻으려면 각 단계에서 부동을 초기화해야합니다.

float newNum = 0.0; 
0

코드에서 가비지 값을 사용하면 C++의 정의되지 않은 동작이 호출됩니다. 정의되지 않은 동작은 아무 일도 일어나지 않음을 의미합니다. 즉 코드의 동작이 정의되지 않았 음을 의미합니다.

float newNum; //uninitialized (may contain some garbage value) 
newNum +=i; // same as newNum=newNum+i 
           ^^^^^ 
           Whoa!! 

그래서 더 나은 당신이 "C++의 몇 가지 기본 값을 할당해야"되는 표현했습니다 생각이

float newNum=0; //initialize the variable 
    for (int i = 1; i <=5; ++i){ 
     newNum +=i; 
     cout << newNum << " "; 
    } 
0

실수를보십시오. 그건 그렇지 않을거야. newNum에 덤프가 있습니다.

0

나는 지난 달 이후 너무 많은 C++를하지 않지만, :

플로트는 새롭게 각 반복에 할당입니다 값.초기 0 값에 대해서는 조금 놀랐습니다. 문제는 각 반복 후에 float 값이 범위를 벗어나 실행되고, 다음 단계 (루프 범위의 재 입력)가 먼저 float 메모리를 재 할당하므로 방금 해방 된 동일한 메모리 블록을 반환하는 경우가 많습니다.

당신은 초기화되지 않은 자동 스택 변수를 사용하는

0

(내가 어떤 비난의 - P 기다리고 있어요). 각 루프 반복에서 스택의 동일한 위치에 있으므로 이벤트가 정의되지 않은 값을 갖지만 이벤트에서 이전 반복의 값이됩니다.

첫 번째 반복에서 유의할 점은 아무런 가치가 없다는 것입니다. 0.0.

0

디버그 빌드에서 예상되는 답변을 얻었을 수도 있지만 디버그 빌드가 변수를 0으로 초기화 할 때 해제되지 않을 수 있습니다. 이것은 정의되지 않은 동작이라고 생각합니다. C++은 자동으로 변수를 초기화하지 않기 때문에 루프를 돌 때마다 새로운 변수를 생성하지만 방금 릴리스 된 것과 동일한 메모리를 계속 사용하고 이전 값을 제거하지 않습니다. . 다른 사람들은 당신이 말도 안되는 완벽한 인쇄로 끝날 수 있다고 말했기 때문에 말입니다.

초기화되지 않은 변수를 사용하는 것은 컴파일 오류가 아니지만 일반적으로 경고가 있어야합니다. 항상 경고를 켜고 그 중에서도 더 이상 보이지 않는 무언가를 넣으 려하면 항상 모두 제거하십시오.

2

C++의 몇 가지 기본 값을 할당해야합니다 이것은 당신의 가정에서 실수

(huhm, 0이어야합니다). C++은 기본값을 할당하려고 시도하지 않으므로 명시 적으로 모든 것을 초기화해야합니다.

대개 루프 주위에서 매번 동일한 위치를 메모리에 할당하므로 newNum은 각 반복에서 계속 반복되는 것처럼 보입니다.

더 복잡한 시나리오에서 newNum에 할당 된 메모리는 본질적으로 무작위 상태이며 이상한 동작을 기대할 수 있습니다.

0

C

http://www.cplusplus.com/doc/tutorial/variables/ ++

일부 기본값 할당해야한다 (huhm, 0이어야합니다).

C++은 (는하지만, 디버그 빌드에 0xcccccccc 같은으로 설정할 수 있습니다) 기본 생성자없이 일을 초기화하지 않습니다 - 때문에 어떤 적절한 도구로, 컴파일러는 "생각"당신은 초기화를 제공하지 않은 경우 그것은 당신이 원하는 것입니다. float에는 기본 생성자가 없으므로 unknown 값입니다.

출력이 "1 2 3 4 5"가 될 것으로 예상했습니다. 인쇄 된 것은 "1 3 6 10 15"입니다.

float newNum이 각 반복에 대해 새 변수를 만들 것이라는 나의 기대치에 대해 알고 싶습니다.

변수는 메모리 블록입니다. 이 변수에서 스택에 할당됩니다. 당신은 그것을 초기화하지 않았고 각각의 반복은 단지 같은 메모리 주소에 놓이게되어서 이전 값을 저장합니다. 물론 그러한 행동에 의존해서는 안됩니다.반복을 통해 가치를 유지하려면 루프 밖에서 값을 선언하십시오.

, BTW 자바 코드의이 작품으로 인해 newNum에 컴파일되지 않습니다 당신에게 변수가 초기화되지 않는다는 경고 (예를 줄 것 C++ 정상 컴파일러,

BTW

를 초기화하지 " 경고 C4700 : 초기화되지 않은 지역 변수 'f'used "). 그리고 디버그 빌드에서 crt 디버그 오류가 발생합니다 (예 : "런타임 검사 실패 # 3 - 변수 'f'가 초기화되지 않고 사용됨).

그것은 아마도 더 나은

부정적이다. 당신은 때때로 초기화되지 않은 변수를 필요로합니다. (예를 들어, "표준"할당 연산자없이 포인터/참조에 의해 함수에 전달함으로써 초기화 할 수 있습니다.) 모든 것을 초기화하도록 강요하는 것은 저의 낭비 일 것입니다. 시각.

+0

설명해 주셔서 감사합니다. 귀하의 마지막 요점은 특히 의미가 있습니다. –