Ъ-Говнокод. Часть 1

Начинаю серию публикаций про странные, и в большинстве случаев глупые и нецелесобразные, приемы программирования.
Сегодня речь пойдет о GNU C, его инкрементах/декрементах и операторах отрицания.

Не-не-не!
Допустим у нас есть некая булева переменная variable со значением true. Скомпилируется-ли нижеследующий код:
bool variable = true;
if (!!!!!!!!!!!!!!!!!!!!variable){
cout << variable << endl;
}
Да, этот код правильно скомпилируется. Просто каждый восклицательный знак будет инвертировать значение текущего выражения на противоположное. В данном примере выражение в ходе проверки условия 20 раз поменяет значение true<>false, и в итоге станет true, и, соответственно, выведет на экран содержимое переменной variable.

А что вернет (если вообще вернет) этот код?
bool variable = true;
if (!!!!!!false != variable){
cout << variable << endl;
}
Он вернет true. Восклицательные знаки инвертируют false в false, а оно, есстественно, не есть true.

А этот:
bool variable = true;
!variable++;
cout << variable << endl;
Восклицательный знак изменит true в false, а инкремент увеличит false до true.
Перейдем к инкрементам.

++i--??
Чему будет равно i:
int i = 0;
i+++1+1+1;
cout << i << endl;
i будет равно 1. Инкремент увеличивает непосредственно значение переменной, а результат прибавления остальных трех единиц должен сохраняться в переменную, и поэтому не изменяет значение i.

Чему будет равно j?
int j = 0;
j+++j+++j++;
cout << j << endl;
j будет равно трем, так как тут выполняется три операции инкремента.

И на последок декременты:
int j = 3;
--j-j---j;
cout << j << endl;
j будет равно единице.

Продолжение следует...

ЗЫ: А выполнится-ли такая конструкция: ++i--?

Поблагодарить автора

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>