2009-07-07 6 views
7

나는 나의 호기심 때문에 주로 포즈를 취한다는 간단한 질문을 가지고있다.for 루프 조건에서 성능 차이가 있습니까?

이 두 코드 줄의 차이점은 무엇입니까?

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

조건의 선택은 완전히 임의 (C++에서), 나는 사이의 차이에 불과 관심, 그리고 & &.

나는 어떤 방법 으로든 코딩 할 수있는 초보자는 아니지만, 나는 쉼표 연산자를 사용해 본 적이 없다.

성능/동작의 차이점이 있습니까 아니면 순수하게 미적입니까?

마지막으로 한 메모는 조건부 연산자보다 튀기는 성능이 더 뛰어나다는 것을 알고 있습니다. 그러나 나는 단지 궁금합니다. 날 기쁘게 해.

답장을 보내 주셔서 감사합니다.

이 질문을 썼던 코드가 나와서 설명한대로 쉼표 연산자를 오용했음을 알 수 있습니다. 나는 그 차이점이 무엇이고 왜 그것이 & & 연산자가 아닌지 궁금해했다. 그러나 그것은 방금 잘못 작성되었다. 나는 아무 문제가 없다고 생각하지 않았다. 나를 정돈 해줘서 고마워.

+0

왜 성능이 걱정 되십니까? 이 질문에 대한 답변을 얻는 데 걸리는 시간 동안, 하나 또는 다른 표기법을 사용하여 저장 한 9 나노초는 이미 손실되었을 것입니다. "조숙 한 최적화는 모든 악의 뿌리입니다 ..." – Juliet

+17

그는 그가 궁금하다고 말하지 않았습니다. 호기심이 많습니다. 누군가가 "알고 싶어"할 때마다 사람들이 "조숙 한 최적화"깃발을 흔들기를 멈추고 싶습니다. 호기심은 좋은 것 *입니다. –

+5

질문에 "성능"또는 "빠른"단어를 언급 할 때마다 자동으로 의견을 게시하는 필터를 구현하면 얼마나 많은 시간을 절약 할 수 있을지 궁금합니다. 시민, 지금은 일하러 돌아갑니다 ";-) –

답변

10

그것처럼 보이지만,

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

은 해당되지 않습니다.

다음은 증명입니다.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

결과 : 루프 종료시기를 결정할 때이 N > 0를 사용하는 것을 의미합니다

5 

. N = 10 인 경우 항상 true이고 루프가 종료되지 않습니다.

이것을 실행하고 증명을보십시오.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

N은 방금 즉 제 한번 확인하여 N > 0 수표를 제거 할 수있는 내부 루프 변하지 않는 상수 또는 변수이면

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

왜 아무도 이것을 투표하지 않은 이유는 모르겠습니다. 나는 explaination을 요구할 때 잘 생각하고 상세한 답변을 좋아한다. 감사합니다 – CodeFusionMobile

+3

명확하게 차이를 진술하지 않기 때문에 나는 그것을 투표하지 않을 것이고, 표준 또는 어떤 문서를 보는 것보다 실험에 의해 의미를 결정하려고 노력할 것입니다. –

+0

저는 개인적으로 예제와 실험을 좋아합니다. RichieHindle의 대답은 짧고 정확했지만 설명이 정확하지 않았으며 내 질문에 실제로 차이점이 무엇인지 대답하지도 않았습니다. 비록이 답이 문제의 원인을 자세히 기술하지는 못했지만, 사실 그 질문에 대답했습니다. – CodeFusionMobile

33

쉼표를 사용하면 간단하게 은 첫 번째 조건 인을 삭제합니다.

쉼표 연산자는 "이 명령문을이 순서대로 실행하고 마지막 명령의 값을 사용합니다"를 의미합니다.

+0

에서와 같이 완전히 무시하고 검사를 수행하지 않습니까? – Victor

+2

"i < N, N > 0'"의 값은 "N> 0'"의 값과 같습니다. – ephemient

+1

@Victor : i와 N을 비교하여 결과를 무시한 다음 N과 0을 비교하고 그 결과를 사용하여 루프를 계속할지 여부를 결정합니다. 최적화 된 코드에서는 i와 N을 비교하는 데 별 어려움이 없을 것입니다. – RichieHindle