DMZ
06:05 20-09-2005 За что я люблю C
for(;P("\\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2),P("| "+(*u/4)%2));
Комментарии:
Arde
11:14 20-09-2005
*любуется* Это откуда?
DMZ
11:18 20-09-2005
Из одного баяна. Прикол в том, что можно найти этому выражению смысл и даже скомпилировать
Arde
11:21 20-09-2005
*начинает ффтыкать и искать смысл*
Советский инженер
18:50 16-10-2005
То есть то, что такое выражение скомпилируется - это хорошо?...

А если придется разбираться с чужим кодом, где на 10 строчек одна такая, мнение о С изменится?....

А я например С не за это лублу...
Riskoff
13:53 19-10-2005
Типа я не понял... Что делает функция P() и как она описана в оригинале? Никакого приведения в типу аргумента - как же оно откомпилируется? А если откомпилируется, то не факт, что будет правильно работать.
DMZ
05:43 20-10-2005
P() может описываться например так...

int P(char*)

или даже так

char* P(char*)

или const char*

Насчет приведения типов... это я понимаю "_"+(*u++/8)%2 <- вот этот кусок?
Ну тут всё просто, C с памятью работает прямее некуда, так что любая ссылка (char*, int*, MyClass*...) это всего навсего 32-битное целое число (на 64-битных процессорах оно уже 64-битное). u у нас тоже ссылка, хотя ничто не мещает ей быть переменной целого или вещественного типа (не забываем, что С хоть и жаден до типов данных, но double в int или ссылку в int для него перевести не проблема, а вот в обратную сторону это надо ручками, да и к тому же от порядка операндов зависит)
Так чему же равно "_"+(*u++/8)%2?
Вспоминаем приоритеты операторов...
Итак, вычисляется *u - это некоторое число расположенное в ячейке с адресом u. Сколько в нём байт - зависит от типа u (char - 1 байт, int - 4 байта). После этого u увеличивается на 1 - сдвигается на следующие значение. После этого то число, которое мы получили при *u делится на 8? а потом считаем остаток при делении на 2.

Пример.

допустим
char u[]="hello";
Что имеем?
*u='h' или *u=108; что собственно одно и тоже.
потом u++ . u="ello";
*u++/8=13; 108/8=13.5, C производит округление и получаем 13
13%2=1

итак, правый операнд в "_"+(*u++/8)%2 принимает значения 0 или 1. А само выражение или равняется "_" или на еденицу больше. А что такое "_"? это 32-битное целое число, равное номеру ячейки памяти, где хранится "_"

Так что всё это компилится еще как.

----------------sample.c---------------------
int P(char*n)
{
return n[0];
}
void main()
{
char str[]="hello";
char* u=str;
int R=10,e=10,C=10;

for(;P("\\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2),P("| "+(*u/4)%2));
}
----------------sample.c---------------------

А вот вопрос правильно или нет, зависит от задачи в которой всплывает эта строчка...
Советский инженер
15:56 29-10-2005
А теперь попробуйте разными компиляторами с разными оптимизаторами... :_))))