루프 안에서 변수를 정의하는 것이 좋습니까? [닫은]


15

내 강사는 한 번 루프 안에 변수를 정의해서는 안된다고 말 했지만 정직한 이유를 여전히 이해하지 못합니다.

그 단점은 무엇입니까?

몸이 나에게 설명해 줄 수 있습니까?


7
강사는 어떤 프로그래밍 언어를 가르치셨습니까?
Brian

2
루프에서 기본이 아닌 유형으로 변수를 정의하면 프로그램은 루프를 통해 매번 생성자를 불필요하게 호출 할 수 있습니다. 루프 외부에서 한 번만 정의 해야하는 경우 그렇게하십시오.
Brandin

17
강사의 말에 대해 혼동이있을 때 가장 좋은 리소스는 강사에게 문의하는 것입니다. Q & A 사이트에서 제공 할 수없는 조밀 한 앞뒤 커뮤니케이션을 제공 할 수 있습니다.

1
교차 사이트 중복 : 루프 전 또는 루프에서 변수 선언의 차이점은 무엇입니까? (물론 그러한 기초 질문 (C ++에 관한 질문 포함)에 대한 해당 사이트의 많은 사본).
피터 Mortensen

2
그 조언은 상황에 따라 다릅니다. 개인적인 스타일의 문제로, const(기능적 프로그래밍의 습관)이없는 이유가 없다면 변수를 선언하는 것을 선호합니다 . 나는 그것들을 수정하지 않을 것이고, 옵티마이 저는 그들이 필요하지 않은 것을 감지해야하거나, 심각한 버그를 예방할 것입니다. 이러한 상수 중간 값이 루프 반복에 고유 한 경우 루프 내부에서 선언하는 것을 의미합니다. 그러나 루프 외부에서 변수를 선언해야하는 또 다른 시간은 루프 외부에서 변수를 참조 할 때입니다. 예를 들어 저장중인 결과.
Davislor

답변:


42

루프 내에서 변수 를 정의 하는 것은 문제가되지 않습니다 . 실제로 식별자는 가능한 한 가장 작은 범위로 제한되어야하므로 모범 사례입니다.

나쁜 점은 루프가 실행 되기 전에 변수를 한 번만 할당 할 수 있다면 루프 내에서 변수 를 할당 하는 것 입니다. 과제의 오른쪽이 얼마나 복잡한 지에 따라, 이것은 다소 비싸고 루프의 런타임을 지배 할 수 있습니다. 모든 반복에서 동일한 계산 값을 사용하는 루프를 작성하는 경우 루프 위에서 확실히 계산해야합니다 . 이는 범위를 최소화하는 것보다 더 중요합니다.

명확히하기 위해 : compute()항상 같은 값을 반환하는 한, 이것은

int value = compute();
while (something) {
    doSomething(value);
}

이보다 똑똑하다 :

while (something) {
    int value = compute();
    doSomething(value);
}

2
루프에서 변수를 어떻게 정의하고 루프 앞에 할당합니까?
Masked Man

6
@MaskedMan, 당신이 오해하고 있다고 생각합니다. Kilian의 의미는 루프를 반복 할 때마다 동일한 값이 할당 된 변수가있는 경우 (예 : 동일한 날짜 변수가로 설정 됨 1/1/1900) 변수를 선언하고 값을 루프보다 먼저 지정해야합니다.
ps2goat

2
지난 20 년 동안 (저학년 컴파일러 과정 이외의) 컴파일러가 각 반복에 대해 동일한 값을 할당하고 해당 할당을 루프 밖으로 옮기는 것을 알지 못할 것이라고 생각하지 않습니다.
TMN

14
@ tmn : 컴파일러가 코드 선명도를 높여서 스스로 할 수있는 일을하지 않도록하십시오.
Robert Harvey

10
@TMN 일 필요는 없습니다. 컴파일러가 계산에 부작용이 없음을 증명할 수있는 경우에만 최적화가 가능합니다.
Paul Draper

16

복잡한 유형에는 사소한 생성자와 소멸자가 있습니다.

루프 본문의 시작과 끝에서 호출됩니다 (초기화되고 범위를 벗어남). 초기화에 비용이 많이 든다면 일부 메모리를 할당해야하므로 피해야합니다.

그러나 사소한 유형의 경우 문제가되지 않습니다. 할당 및 할당 해제 자체는 스택 포인터에서 값을 더하고 뺍니다. (최적화 될 것입니다)


고마워, 내가 찾던 정답!
gebbissimo 2016 년

6

글쎄, 그의 충고는 약간 너무 간단합니다.
이 모든 방법 범위에 따라 좋은 아이디어 를 통해 사람들의 염려나쁜 생각 으로 불가능합니다 .

  1. 오래된 것을 파괴하고 새로운 것을 만드는 것보다 재사용이 저렴할 때마다 따라야합니다.

    #include <iostream>
    #include <string>
    
    int main() {
        std::string s; // Don't needlessly free the buffer
        while ((std::cin >> s))
            std::cout << s;
    }
  2. 성능에 문제가되지 않으면 스타일 문제로 피해야합니다.

    #include <stdio.h>
    #include <stdlib.h>
    int f(int, int);
    
    int main() {
        for (int i = 0; i < 100; ++i) {
            int x = rand(); // Declared here so you don't need to hunt it down.
            printf("%d => %d\n", x, f(x-1, x+i));
        }
    }
  3. 당신은 정말 더 악화 성능이나 잘못된 의미가있는 경우를 피해야한다.

    #include <iostream>
    #include <string>
    std::string generate(int);
    
    int main() {
        for(int i = 0; i < 100; ++i) {
            std::string s = generate(i); // Using copy-ellision here
            std::cout << s;
        }
    }
  4. 당신은 할 수 사용 된 유형도 스와핑을 허용 할 때를 수행하거나 이동 할당하거나 복사 할당.

    #include <iostream>
    #include <puzzle>
    
    int main() {
        for (int i = 0; i < 100; ++i) {
            Puzzle x(i); // Puzzle is an immutable class. For whatever reasons.
            std::cout << x;
        }
    }

2
"루프에서"의 정의에 따라, 1은 for (std::string s; std::cin >> s;) ..."외부" 로 변경 될 수 있으며 여전히 "외부" 일 수 있습니다
Caleth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.