Другие языки программирования и технологии

c++, if Без условия ?

Кусок кода:
int main(){

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

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

return 0;
}

Компилятор пропускает данную запись if, но разве оно вообще может выполняться, ведь if должен содержать условие, а в данном случае это не условие.
Может быть это какае-то особенность языка C++ и здесь содержится определенное условие ?
Gofree Gofree
Gofree Gofree
1 616
Ну так как массив по сути является указателем, то компилятор скорее всего будет проверять/думать примерно так "а не указывает ли наш указатель *(*(field + j) + i) на NULL ?? " -- Неа, тогда заходим в тело блока if() {}. Так как массив у вас заполнен в том диапазоне, в котором вы проверяете, то NULL нигде не будет, значит условие всегда будет срабатывать.

В любом случае лучше так не делать, а писать адекватный код с адекватными сравнениями и названиями переменных. А то все эти побочные (как там они называются, back side что ли) эффекты C и C++ по-разному работают в разных компиляторах.

И если что-то написано в скобках после if ( ЗДЕСЬ ), то это уже значит что условие есть. Компилятор пытается его переварить в логический тип. Как бы не извращался программист ( просто некоторые и присваивания там делают, и цепочки присваиваний и скобки не ставят для определения приоритета).
Виктор Павленко
Виктор Павленко
5 124
Лучший ответ
Gofree Gofree Как я понял, если хотя бы один элемент массива инициализирован, то функция if будет срабатывать, причем лишь единожды.
Роман Волгин Тут нет никаких побочных эффектов.
Роман Волгин Слово NULL принято использовать для указателей (в C++ предпочтительней использовать nullptr).
Тип выражения *(*(field + j) + i) совпадает с типом field[i][j] (только перепутаны индексы) - это int.
>ведь if должен содержать условие
Не должен, если это C/C++
Исроил Табаров
Исроил Табаров
97 380
Значение field[i][j] равное 0 компилятор понимает как false.

Такая же ситуация в языках Форт и Ассемблер.
Hasan Aras Так работает во многих языках. Ассемблер зря упомянули, в Ассемблере всё по-другому.
Синтаксис такой
if (выражение)
где "выражение" интерпретируется как выражение логического типа. Для чисел ноль превращается в false, всё остальное в true. Для указателей nullptr - false, всё остальное - true. Для классов используется неявное приведение к bool.
Роман Волгин
Роман Волгин
58 065
Это пошло с ассемблера:

;;; Для того, чтобы сравнить два регистра, CPU сначала как бы вычитает одно из другого, а потом проверяет на 0.

CMP RAX, RBX
JZ addr

Если опустить сравнение, останется просто проверка на 0:

TEST RAX, RAX
JZ addr

Си - это как бы высокоуровневый ассемблер. Поэтому внутри if() может быть не только логическое выражение, но и арифметическое (или его отсутствие). Или даже вызов функции!
RR
R R
26 548
запись if (field[i][j]) равносильна записи if (field[i][j]!=0)
Иван Касьянов
Иван Касьянов
15 714