2014-09-09 3 views
-1

Может кто-то тщательно объяснить, почему в этом случае для повторения цикла 10 раз?Является ли указатель действительным условием для цикла?

#include <iostream> 
using namespace std; 
int main(){ 
    int length=-1; 
    char s[]="Bad or nice";//10 characters 

    for (char *q = s; *q; ++q){ 
    cout << *q; 
    length++; 
    } 

    cout << "\n" << length; 

return 0; 
} 
+0

** ОЧЕНЬ ВАЖНО: ** Условие не сравнивает значение указателя, а указывает на его переменную. Исследователь * указатель * и * указатели разыменования *. –

+0

Возможно дублирование - http://stackoverflow.com/questions/24761235/dereferencing-a-pointer-as-for-loop-condition – Jacob

ответ

2

Условие - это значение в ячейке памяти указателя (*q).

Поэтому цикл завершается, когда достигается знак NULL (в конце строки), который оценивается как false.

+0

Итак, условия q говорят: «Цикл заканчивается, а NULL достигнут», да? – Jacob

+0

Значит, он может быть записан для (* q = s; * q! = '\ 0'; ++ q), да? – Jacob

+0

Лучше сказать, что условие '* q' означает, что цикл выполняется до тех пор, пока не будет достигнут символ« NULL ». – mstrthealias

4

Всего символов в строке является 11 исключением \0. Второй for выражение *q становится false, когда q указывает на последний символ строки s, который является \0.
Следовательно, цикл повторяется 11 раз. Вы получаете вывод 10, потому что вы инициализировали length с -1.

+0

Ok Даже если я задал длину = 0; Я до сих пор не понимаю, почему он повторяется 11 раз. – Jacob

+0

@Jacob; Так понятно ? – haccks

+0

Да, это так. Спасибо. – Jacob

Смежные вопросы