Регистрация
27 Дек 2013
Сообщения
77
Репутация
0
Спасибо
0
Монет
0
Кусок кода:
int main(){

int field[5][5] = { 0 } ;

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (field[j]) {
std::cout << "hey!" << std::endl;
}
}
}

return 0;
}

Компилятор пропускает данную запись if, но разве оно вообще может выполняться, ведь if должен содержать условие, а в данном случае это не условие.
Может быть это какае-то особенность языка C++ и здесь содержится определенное условие ?
 
Синтаксис такой if (выражение) где "выражение" интерпретируется как выражение логического типа. Для чисел ноль превращается в false, всё остальное в true. Для указателей nullptr - false, всё остальное - true. Для классов используется неявное приведение к bool.
 
Ну так как массив по сути является указателем, то компилятор скорее всего будет проверять/думать примерно так "а не указывает ли наш указатель *(*(field + j) + i) на NULL ?? " -- Неа, тогда заходим в тело блока if() {}. Так как массив у вас заполнен в том диапазоне, в котором вы проверяете, то NULL нигде не будет, значит условие всегда будет срабатывать. В любом случае лучше так не делать, а писать адекватный код с адекватными сравнениями и названиями переменных. А то все эти побочные (как там они называются, back side что ли) эффекты C и C++ по-разному работают в разных компиляторах. И если что-то написано в скобках после if ( ЗДЕСЬ ), то это уже значит что условие есть. Компилятор пытается его переварить в логический тип. Как бы не извращался программист ( просто некоторые и присваивания там делают, и цепочки присваиваний и скобки не ставят для определения приоритета).
 
Назад
Сверху