Начинаю серию публикаций про странные, и в большинстве случаев глупые и нецелесобразные, приемы программирования.
Сегодня речь пойдет о GNU C, его инкрементах/декрементах и операторах отрицания.
Не-не-не!
Допустим у нас есть некая булева переменная variable со значением true. Скомпилируется-ли нижеследующий код:
bool variable = true;Да, этот код правильно скомпилируется. Просто каждый восклицательный знак будет инвертировать значение текущего выражения на противоположное. В данном примере выражение в ходе проверки условия 20 раз поменяет значение true<>false, и в итоге станет true, и, соответственно, выведет на экран содержимое переменной variable.
if (!!!!!!!!!!!!!!!!!!!!variable){
cout << variable << endl;
}
А что вернет (если вообще вернет) этот код?
bool variable = true;Он вернет true. Восклицательные знаки инвертируют false в false, а оно, есстественно, не есть true.
if (!!!!!!false != variable){
cout << variable << endl;
}
А этот:
bool variable = true;Восклицательный знак изменит true в false, а инкремент увеличит false до true.
!variable++;
cout << variable << endl;
Перейдем к инкрементам.
++i--??
Чему будет равно i:
int i = 0;i будет равно 1. Инкремент увеличивает непосредственно значение переменной, а результат прибавления остальных трех единиц должен сохраняться в переменную, и поэтому не изменяет значение i.
i+++1+1+1;
cout << i << endl;
Чему будет равно j?
int j = 0; j будет равно трем, так как тут выполняется три операции инкремента.
j+++j+++j++;
cout << j << endl;
И на последок декременты:
int j = 3;j будет равно единице.
--j-j---j;
cout << j << endl;
Продолжение следует...
ЗЫ: А выполнится-ли такая конструкция: ++i--?