A shelter from pigs on the wing
DMZ
дневник заведен 09-08-2004
постоянные читатели [32]
3 CaHuTaPa, 517design, Arde, Art`Is, aviabaza, BlackDrago, CyberJoe, DeadMorozz, Depeche Mode, DMZ, d_r, Ewige, glv12 Marla Zinger, goldenandy, Grimble, Hydralisk, Jude, Katrine Himitsu, Leave-me-alone, MISTIK, My3a, Nash, Nicholas Hawkwood, Pingvin, Riskoff, VorteX DrAgON, Wolfram, Букля_, достало, Муть, Рика, Эль
закладки:
цитатник:
дневник:
местожительство:
Красноярск, Россия, Сибирь
интересы [24]
программирование, C++, Depeche Mode, Star Wars, perl, DVD, JavaScript, FAR, lost, 80е, Half Life 2, долго спать, Miami Vice, веб-роботы, кентаврицы
антиресы [9]
грибы, грейпфрутовый сок, мёртвые люди, табличка обед, долго спать
20-09-2005 06:05 За что я люблю C
for(;P("\\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2),P("| "+(*u/4)%2));
Комментарии:
Я есть.
*любуется* Это откуда?
20-09-2005 11:18
Камрад
Из одного баяна. Прикол в том, что можно найти этому выражению смысл и даже скомпилировать
Я есть.
*начинает ффтыкать и искать смысл*
Вершу НТР с 9-ти до 5-ти
То есть то, что такое выражение скомпилируется - это хорошо?...

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

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

А вот вопрос правильно или нет, зависит от задачи в которой всплывает эта строчка...
Вершу НТР с 9-ти до 5-ти
А теперь попробуйте разными компиляторами с разными оптимизаторами... :_))))

Ваш комментарий:
Камрад:
Гость []
Комментарий:
[смайлики сайта]
Дополнительно:
Автоматическое распознавание URL
Не преобразовывать смайлики
Cкрыть комментарий
Закрыть