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

Категория: C / C++ Комментариев: 0

Начинаю серию публикаций про странные, и в большинстве случаев глупые и нецелесобразные, приемы программирования.
Сегодня речь пойдет о 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--?

Автор: Кто-то   @   21 марта 2009 Комментариев: 0
Метки : , ,

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

Webmoney Z163628999150, R617151845974

Комментариев: 0

Комментариев к этой записи поке нет. Ваш комментарий будет первым.
оставить комментарий

Предыдущая запись
«
Следующая запись
»