2012-04-09 5 views
1

Я работаю над своим вопросом на C++, чтобы подготовиться к моему предстоящему тесту, и я борюсь с условием цикла, которое я никогда раньше не видел.Когда условие этого цикла цикла станет ложным?

 for (int i = 0; s[i]; i++) 

Строка s, которая была отправлена ​​из основных является "Two roofs to fix"

Вопрос, когда это для условия цикла станет ложным?

+4

Подсказка: строка '' Две крыши для исправления '' имеет нулевой ограничитель в конце строки. Как вы думаете, нулевой ограничитель оценивается во втором выражении цикла 'for'? –

+1

Итак, что вы говорите, после строки, которую она должна остановить, потому что она не может идти дальше, чем это правильно? – Ali

+1

@Ali: нулевой ограничитель '\ 0' в конце вашей строки имеет значение 0, которое преобразуется в значение false. –

ответ

5

Условие цикла становится ложным, когда ударяется нулевой нуль '\0'. (if (0) оценивает значение false)

Обратите внимание: эта форма проверки является возможной ошибкой, ожидающей возникновения, если строка не завершена нулем.

+2

-1: Если он знал, что строки закончились в '\ 0', я уверен, что он не задал бы вопрос. –

+7

вы хотите дать мне -1 для правильного ответа? –

+1

Нет, для * неполный * один. –

2

Просто для уточнения ответа @ MitchWheat, если выражение, используемое как условие, указывает только значение, например if (x), то оно по существу эквивалентно if (x != 0). Если значение представляет собой тип указателя, то вместо этого оно эквивалентно if (x != NULL) (хотя на самом деле это не «вместо», так как NULL == 0).

1
#include<iostream> 
#include<string> 

using namespace std; 

int main() 
{ 
    string s = "Two roofs to fix"; 
    int i; 
    for (i = 0; s[i]; i++); 
    cout<<"i = "<<i<<endl; 
} 

Я тестирую проблему с вышеуказанным кодом. Он возвращает ошибку «строковый индекс вне диапазона». Поэтому, если длина строки s равна Len, s [Len] является незаконной. В вашем коде s не является указателем char *, а строкой. Так что это неправильно.

+1

Он сказал строку, но он не знал о 'std :: string' или' char * '. Поскольку он не упоминал никаких ошибок, я бы предположил, что это 'char * s;' – loganfsmyth

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