2009-07-07 4 views
7

У меня есть простой вопрос, который я представляю в основном для моего любопытства.Разница в производительности для условия цикла?

В чем разница между этими двумя строками кода? (В C++)

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

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

Выбор условий является совершенно произвольным, я просто заинтересован в различиях между ними, и & &.

Я не новичок в кодировании любым способом, но я никогда не беспокоился с оператором запятой.

Существуют ли различия в характеристиках/поведении или это чисто эстетические?

Одна последняя заметка, я знаю, что есть большая рыба производительности, чтобы обжарить, чем условный оператор, но мне просто интересно. Побалуйте меня.

Редактировать Спасибо за ваши ответы.

Оказалось, что код, вызвавший этот вопрос, неправильно использовал оператор запятой в том виде, как я описал. Я задавался вопросом, какая разница и почему это был не оператор & &, но он был просто написан неправильно. Я не думал, что с ним что-то не так, потому что это сработало отлично. Спасибо, что выпрямил меня.

+0

Почему вы беспокоитесь о производительности? В то время, когда требуется получить ответ на этот вопрос, 9 наносекунды, которые вы сохранили бы с использованием одной или другой нотации, уже будут потеряны. «Преждевременная оптимизация - корень всего зла ...» – Juliet

+17

Он не сказал, что беспокоится - просто любопытно. Я действительно хочу, чтобы люди переставали размахивать флагом «преждевременной оптимизации» каждый раз, когда кто-то «просто хочет знать». Любопытство - это хорошая вещь *. –

+5

Интересно, сколько времени было бы спасено, если бы SO реализовал фильтр, который каждый раз, когда кто-либо упоминает слова «производительность» или «быстрее» в вопросе, просто авто-сообщения с комментарием «вы не можете думать о что, гражданин, теперь возвращайся к работе »;-) –

ответ

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; 
} 

Результат:

5 

Это означает, что при определении того, когда цикл будет выходить он будет использовать N > 0. Если N = 10, это означает, что оно всегда будет истинным, и цикл никогда не выйдет.

Запустите это и посмотрите на доказательство.

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

Я не знаю, почему никто не проголосовал за это. Мне нравится хорошо продуманный и подробный ответ, когда я прошу объяснения. Спасибо – CodeFusionMobile

+3

Я бы не проголосовал за это, потому что в нем четко не указано различие и пытается определить смысл эксперимента, а не смотреть на стандарт или любую документацию. –

+0

Мне нравятся примеры и эксперименты лично. Ответ Ричи Хиндла был коротким и точным, но не очень описательным, и он не ответил на мой вопрос, какова фактическая разница. Даже если в этом ответе не было детальной информации о причине проблемы, она действительно ответила на вопрос. – CodeFusionMobile

33

Использование такой запятой будет просто отказаться от первого условия.

Оператор запятой означает «выполнить эти инструкции в этом порядке и принять значение последнего».

+0

как в нем полностью игнорирует его и не выполняет проверку? – Victor

+2

Значение «i < N, N > 0'» совпадает с значением «' N> 0' ». – ephemient

+1

@Victor: сравнивает i и N, отбрасывает результат, затем сравнивает N и 0 и использует результат, чтобы решить, продолжать ли цикл. В оптимизированном коде он, вероятно, не потрудится сравнить i и N. – RichieHindle