если без условий? - PullRequest
       17

если без условий?

10 голосов
/ 26 ноября 2010

Я только что нашел этот "C ++" сегодня и не могу понять его:

if(array[i][j]) {--i;--j;}

Может кто-нибудь объяснить мне, как это работает?Я просто не понимаюКакое состояние здесь?Кажется, что это будет правдой каждый раз, но когда я избавился от IF (так что осталось только это {--i;--j;}), он не работает так же.

Я совершенно новичок в C ++, так чтоПолегче с объяснениями!:)

Спасибо!

Ответы [ 6 ]

20 голосов
/ 26 ноября 2010

В C ++ ненулевое значение может использоваться для обозначения «успеха» в условном выражении.

Это из C99, раздел 6.8.4.1:

Заявление if

2 В обеих формах первое подзаголовок выполняется, если выражение не равно 0.

Из C ++ 03, раздел 6.4

4 Значение условия, которое является инициализированным объявлением в операторе, отличном от оператора switch, является значением объявленной переменной, неявно преобразованной в тип bool. Если это преобразование плохо сформировано, значит, программа плохо сформирована. Значением условия, которое является инициализированным объявлением в операторе switch, является значение объявленной переменной, если она имеет тип целого или перечисления, или же эта переменная неявно преобразуется в тип целого или перечисления. Значением условия, являющегося выражением, является значение выражения, неявно преобразуемое в bool для операторов, отличных от switch; если это преобразование плохо сформировано, программа плохо сформирована. Значение условия будет упоминаться просто как «условие», при котором использование однозначно.

И логическое преобразование определено в 6.3.1.2

6.3.1.2 Булев тип

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

И int - это скалярный тип. Я предполагаю, что это то, чем заполнен ваш массив, так как вы можете использовать одинарные ++ и -- для них.

10 голосов
/ 26 ноября 2010

при условии, что массив - это массив целых (или других целочисленных типов), условие будет ложным, если и только если array[i][j] == 0

3 голосов
/ 26 ноября 2010

if получает true, если array[i][j] получает true при приведении к bool. Если array имеет, например, Значения float или int, все, что не равно 0, будет приведено к true. Ситуация может быть другой для пользовательских типов.

0 голосов
/ 27 ноября 2013

Было бы лучше, если бы я переписал ваш код следующим образом:

if((array[i][j])==true)
{
    --i;
    --j;
}

Так что это означает, что условие if фактически проверяет, является ли ваша строка и значение столбца логическим значением true.Затем он войдет в ваш блок if и уменьшит значения i и j, что означает, что он сместится к предыдущей строке и предыдущему столбцу вашего массива.

Конечно, вам нужно привести тип данныхВаше значение массива в логическое значение до реализации этого.

0 голосов
/ 26 ноября 2010

«условие» является выражением bool.В C ++ int может быть неявно приведено к bool.(где 0 = ложь, а все остальное верно).

0 голосов
/ 26 ноября 2010

Оператору if требуется логическое значение в скобках. Поэтому он будет пытаться явно привести любое ваше выражение в логическое значение. Например, для целых чисел и указателей ненулевое значение будет истинным, а нулевое - ложным.

Так что если ваше выражение (array [i] [j]) может быть приведено к true, тогда условие будет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...