Кусок кода:
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++ и здесь содержится определенное условие ?
Другие языки программирования и технологии
c++, if Без условия ?
Ну так как массив по сути является указателем, то компилятор скорее всего будет проверять/думать примерно так "а не указывает ли наш указатель *(*(field + j) + i) на NULL ?? " -- Неа, тогда заходим в тело блока if() {}. Так как массив у вас заполнен в том диапазоне, в котором вы проверяете, то NULL нигде не будет, значит условие всегда будет срабатывать.
В любом случае лучше так не делать, а писать адекватный код с адекватными сравнениями и названиями переменных. А то все эти побочные (как там они называются, back side что ли) эффекты C и C++ по-разному работают в разных компиляторах.
И если что-то написано в скобках после if ( ЗДЕСЬ ), то это уже значит что условие есть. Компилятор пытается его переварить в логический тип. Как бы не извращался программист ( просто некоторые и присваивания там делают, и цепочки присваиваний и скобки не ставят для определения приоритета).
В любом случае лучше так не делать, а писать адекватный код с адекватными сравнениями и названиями переменных. А то все эти побочные (как там они называются, back side что ли) эффекты C и C++ по-разному работают в разных компиляторах.
И если что-то написано в скобках после if ( ЗДЕСЬ ), то это уже значит что условие есть. Компилятор пытается его переварить в логический тип. Как бы не извращался программист ( просто некоторые и присваивания там делают, и цепочки присваиваний и скобки не ставят для определения приоритета).
>ведь if должен содержать условие
Не должен, если это C/C++
Не должен, если это C/C++
Значение field[i][j] равное 0 компилятор понимает как false.
Такая же ситуация в языках Форт и Ассемблер.
Такая же ситуация в языках Форт и Ассемблер.
Hasan Aras
Так работает во многих языках. Ассемблер зря упомянули, в Ассемблере всё по-другому.
Синтаксис такой
if (выражение)
где "выражение" интерпретируется как выражение логического типа. Для чисел ноль превращается в false, всё остальное в true. Для указателей nullptr - false, всё остальное - true. Для классов используется неявное приведение к bool.
if (выражение)
где "выражение" интерпретируется как выражение логического типа. Для чисел ноль превращается в false, всё остальное в true. Для указателей nullptr - false, всё остальное - true. Для классов используется неявное приведение к bool.
Это пошло с ассемблера:
;;; Для того, чтобы сравнить два регистра, CPU сначала как бы вычитает одно из другого, а потом проверяет на 0.
CMP RAX, RBX
JZ addr
Если опустить сравнение, останется просто проверка на 0:
TEST RAX, RAX
JZ addr
Си - это как бы высокоуровневый ассемблер. Поэтому внутри if() может быть не только логическое выражение, но и арифметическое (или его отсутствие). Или даже вызов функции!
;;; Для того, чтобы сравнить два регистра, CPU сначала как бы вычитает одно из другого, а потом проверяет на 0.
CMP RAX, RBX
JZ addr
Если опустить сравнение, останется просто проверка на 0:
TEST RAX, RAX
JZ addr
Си - это как бы высокоуровневый ассемблер. Поэтому внутри if() может быть не только логическое выражение, но и арифметическое (или его отсутствие). Или даже вызов функции!
запись if (field[i][j]) равносильна записи if (field[i][j]!=0)
Похожие вопросы
- программа C# if i % x == 0 пример
- Помогите решить задачу на языке c++. Не понимаю условия в конце кода.
- Прогроммёры! C# Бошка не варит. Если есть условие if (A или Б) и истинными окажутся оба - условие будет true?
- Объясните толком как и для чего команда " if "C++
- Как можно написать программу на языке C, которая будет выводить числа от 1 до 1000 без if, switch, do, while, for, goto?
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- Помогите с кодом C#. Нужно удалять из строк начальные пробелы с помощью while, if, for, без специальных методов
- Как сделать условие в C++?
- VBA. Чем заменить множествееное использование конструкции "If...Then"?
- Как объединить два оператора " if "?
Тип выражения *(*(field + j) + i) совпадает с типом field[i][j] (только перепутаны индексы) - это int.