Самый странный код
От: YourLastSong  
Дата: 24.01.12 11:22
Оценка:
Здравствуйте, уважаемые господа.

Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?

Например, что-то наподобие такого:

??=include <stdio.h>
??=define TRUE ('/'/'/')
??=define FALSE ('-'-'-')

int i;
int i = 10;

main (argc, argv)
int argc;
char *argv[];
??<
    int a??(??) = ??< [2] = 5, [9] = 3, [3] = 2 ??>;
    int value = 123;
    while (i --> 0)
    ??<
        if ((!!value or ++i) == TRUE)
        ??<
            1[a] = a??(--i, i??);
        ??>
    ??>
??>;


Да, про IOCCC слышал, примеры видел.

Не надо также говорить, что всё это ни для чего не нужно — понятное дело, что использовать триграфы в современных программах бессмысленно (создаёт больше проблем, при этом не решает, пожалуй, ни одной), равно как и old-style объявление функций, если мы, конечно, не имеем дела с поддержкой очень старого кода или вынужденно работаем на очень древнем компиляторе.

Интересуют, прежде всего, очень тонкие моменты языков, которые остались у них по наследству, или просто редко используемые возможности.

Если есть, на что кинуть ссылки — буду очень вам признателен.

Впрочем, если вы вспомните что-то действительно интересное из того, что было на одном из IOCCC — кидайте примеры (может быть, я их просто-напросто не заметил среди остальных).

Заранее благодарю за возможные ответы.
Re: Самый странный код
От: RonWilson Россия  
Дата: 24.01.12 11:29
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, уважаемые господа.


YLS>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


немного не в тему, но часто вижу в коде ядра windows такое:

int func()
{
return (0);
}


зачем здесь скобки?
Re[2]: Самый странный код
От: blackhearted Украина  
Дата: 24.01.12 11:30
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>Здравствуйте, YourLastSong, Вы писали:


YLS>>Здравствуйте, уважаемые господа.


YLS>>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


RW>немного не в тему, но часто вижу в коде ядра windows такое:


RW>
RW>int func()
RW>{
RW>return (0);
RW>}
RW>


RW>зачем здесь скобки?


здесь
Re[3]: Самый странный код
От: RonWilson Россия  
Дата: 24.01.12 11:35
Оценка:
Здравствуйте, blackhearted, Вы писали:

RW>>зачем здесь скобки?


B>здесь


как-то неоднозначно там написано, в итоге зачем это так и не понял однозначно
Re[4]: Самый странный код
От: Were  
Дата: 24.01.12 11:36
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>Здравствуйте, blackhearted, Вы писали:


RW>>>зачем здесь скобки?


B>>здесь


RW>как-то неоднозначно там написано, в итоге зачем это так и не понял однозначно

Ни зачем, им так больше нравится, для однообразия с sizeof и тд
Re[5]: Самый странный код
От: RonWilson Россия  
Дата: 24.01.12 11:37
Оценка:
Здравствуйте, Were, Вы писали:

W>Здравствуйте, RonWilson, Вы писали:


RW>>Здравствуйте, blackhearted, Вы писали:


RW>>>>зачем здесь скобки?


B>>>здесь


RW>>как-то неоднозначно там написано, в итоге зачем это так и не понял однозначно

W>Ни зачем, им так больше нравится, для однообразия с sizeof и тд

ясно
Re[2]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 11:39
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>Здравствуйте, YourLastSong, Вы писали:


YLS>>Здравствуйте, уважаемые господа.


YLS>>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


RW>немного не в тему, но часто вижу в коде ядра windows такое:


RW>
RW>int func()
RW>{
RW>return (0);
RW>}
RW>


RW>зачем здесь скобки?


Это стиль программирования. Многие предложения С/С++, как, например, предложение с if, используют выражения, заключенные в скобки. Это отделяет само ключевое слово от выражения, то есть делает код более ситабельным.
Меня можно встретить на www.cpp.forum24.ru
Re[5]: Самый странный код
От: igna Россия  
Дата: 24.01.12 12:10
Оценка: +1
Здравствуйте, Were, Вы писали:

W>Ни зачем, им так больше нравится, для однообразия с sizeof и тд


Для однообразия с sizeof нечего применять скобки и с sizeof тоже, они там только в том случае нужны, если вычисляется размер типа, а не значения. Однообразие же sizeof значения и sizeof типа скорее во вред чем на пользу, поскольку разные вещи нечинают выглядеть похоже. Правило собственно простое, не использовать скобки, если их можно не использовать, что с sizeof, что с return.
Re[6]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 12:43
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Were, Вы писали:


W>>Ни зачем, им так больше нравится, для однообразия с sizeof и тд


I>Для однообразия с sizeof нечего применять скобки и с sizeof тоже, они там только в том случае нужны, если вычисляется размер типа, а не значения. Однообразие же sizeof значения и sizeof типа скорее во вред чем на пользу, поскольку разные вещи нечинают выглядеть похоже. Правило собственно простое, не использовать скобки, если их можно не использовать, что с sizeof, что с return.


Кто это придумал такое правило?! Странно, что в Microsoft до него не додумались!
Ваши утверждение, что в sizeof надо по-разному записывать синтаксическую конструкцию, не выдерживает критики. Как раз разная запись может привести к не гибкости кода, когда тип в выражении заменили именем объекта. Тогда постоянно при таких изменениях придется то убирать скобкии, то снова их вставлятьт.Более глупой работы по принципу "сначала вырыть яму, а потом эту яму закопать", я не знаю.
Меня можно встретить на www.cpp.forum24.ru
Re[6]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 12:51
Оценка:
Здравствуйте, igna, Вы писали:

I>Для однообразия с sizeof нечего применять скобки и с sizeof тоже, они там только в том случае нужны, если вычисляется размер типа, а не значения. Однообразие же sizeof значения и sizeof типа скорее во вред чем на пользу, поскольку разные вещи нечинают выглядеть похоже. Правило собственно простое, не использовать скобки, если их можно не использовать, что с sizeof, что с return.


И на сакмом деле такое однообразие очень полезно, так как порой трудно сказать, имеете ли вы дело с выражением или с именем типа. То есть если гадать, с чем вы имеете дело, то это лишшняя головная боль, лишнее время, потраченное на повторную компидляцию, когда вы либо забыли поставить скобки, либо забыли их убрать. Как однообразие — это в общем случае хороший стиль программирования, облегчающий чтение кода.
Меня можно встретить на www.cpp.forum24.ru
Re[7]: Самый странный код
От: igna Россия  
Дата: 24.01.12 13:54
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>И на сакмом деле такое однообразие очень полезно, так как порой трудно сказать, имеете ли вы дело с выражением или с именем типа.


Вот будешь последовательно использовать sizeof со скобками только когда имеешь дело с именем типа, будет тебе нетрудно. Программу читают чаще чем пишут, поэтому стоит подумать лишний раз при написании, чтобы потом нетрудно было "сказать" при чтении.
Re: Самый странный код
От: Pavel Dvorkin Россия  
Дата: 24.01.12 13:55
Оценка: 5 (2)
Здравствуйте, YourLastSong, Вы писали:

YLS>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


Есть. И даже при втором, третьем и т.д. взгляде он не кажется очевидным.

http://rsdn.ru/forum/philosophy/2445064.1.aspx
Автор: Pavel Dvorkin
Дата: 12.04.07
With best regards
Pavel Dvorkin
Re[3]: Самый странный код
От: igna Россия  
Дата: 24.01.12 14:00
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Это стиль программирования. Многие предложения С/С++, как, например, предложение с if, используют выражения, заключенные в скобки. Это отделяет само ключевое слово от выражения, то есть делает код более ситабельным.


Мусор никак не может делать код более читабельным. Аналогично можно и использование скобок вокруг выражений после case оправдывать, но какой-же дурак так делает?
Re[8]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 14:18
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Сыроежка, Вы писали:


С>>И на сакмом деле такое однообразие очень полезно, так как порой трудно сказать, имеете ли вы дело с выражением или с именем типа.


I>Вот будешь последовательно использовать sizeof со скобками только когда имеешь дело с именем типа, будет тебе нетрудно. Программу читают чаще чем пишут, поэтому стоит подумать лишний раз при написании, чтобы потом нетрудно было "сказать" при чтении.


Так я и говорю о том, что вы пропагандируете метод по принципу: "сначала выкопать яму, а затем ее закопать"! То есть если сначала было выражение, а затем поменяли операнд на тип, то вам придется снова ставить скобки. А когда снова поменяется на выражение — убирать скобки. Вам больше заняться нечем?!
Проблема в том, что такие, как вы, думаете, что ваш код читают только вы сами, или в крайннем случае читают ваш код члены вашей группы, работающей над проектом. И такая простая мысль, что ваш код могут читать люди, которые вообще не знают яззыка С/С++, вам естественно в голову не приходило. А когда посторонний человек будет читать такой ваш код, где у sizeof в одном случае есть скобки, а в другом нет, то у него будет возникать вопрос, отнимающий лишь время, то ли это опечатка в программе, то ли имеется различный результат выполнения sizeof. Хотя на самом деле результат один — выдается размер памяти, который может занимать объект заданного типа. То есть семантически резыльтат работы sizeof не меняется. Он всегда указывает размер объекта, соответсвующий тому типу выражения, которое предоставлено. Поэтому никаого смысла создавать себе лишнюю работу и запутывать читающего код, нет.
Более того это может привести к ошибкам. Рассмотрите код

std::cout << sizeof x + 1 << std:;endl;

Вы можете уверенно сказать, что имел в вииду автор этого прредложения? То ли он хотел написать sizeof( x ) + 1, то ли sizeof( x + 1 )? из кода нельззя узнать это, код об этом не говорит.
Вам кажется, что пример простой? Тогда я его усложню

std::cout << sizeof x + y << std:;endl;

Что тогда скажите? Думаете, что автор имел в иду sizeof( x ) + y? Ошибаетесь! Автор имел в виду sizeof( x + y ),но сделал опечатку, то есть забыл поставить круглые скобки, согласно вашшей рекомендации!
Меня можно встретить на www.cpp.forum24.ru
Re[4]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 14:20
Оценка: -2
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Сыроежка, Вы писали:


С>>Это стиль программирования. Многие предложения С/С++, как, например, предложение с if, используют выражения, заключенные в скобки. Это отделяет само ключевое слово от выражения, то есть делает код более ситабельным.


I>Мусор никак не может делать код более читабельным. Аналогично можно и использование скобок вокруг выражений после case оправдывать, но какой-же дурак так делает?


Это не мусор! Это средство сделать код читабельным и избежать случайных ошибок.
Меня можно встретить на www.cpp.forum24.ru
Re[9]: Самый странный код
От: blackhearted Украина  
Дата: 24.01.12 14:25
Оценка: 1 (1) +1
Здравствуйте, Сыроежка, Вы писали:

С>Что тогда скажите?


Ничего не скажим, порекомендуем идти и набивать бредом свой "форум".
Re[9]: Самый странный код
От: igna Россия  
Дата: 24.01.12 14:37
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Вы можете уверенно сказать, что имел в вииду автор этого прредложения? ... из кода нельззя узнать это, код об этом не говорит.


Из кода никогда нельзя со стопроцентной достоверностью узнать, что, где и как имел автор. Даже если он комментарий напишет, все-равно нельзя, поскольку написал-то он может одно, а поимел другое. И даже если его спросить, то ответит он одно, а поиметь может кого угодно.
Re: Самый странный код
От: opener  
Дата: 24.01.12 14:42
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, уважаемые господа.


YLS>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


Известная прожка, печатает стихи.

#include <stdio.h>
main (int t, int _, char *a)
{
return!0<t?t<3?
main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a)
:3,main(-94,-27+t,a)&&t==2?_<13?main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?
main(_,t,"@n'+,#'/*s{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/# ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):
main(-65,_,a+1):
main((*a=='/')+t,_,a+1):
0<t?main(2,2,"%s")
:*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"
),a+1);
}
Re[10]: Самый странный код
От: Сыроежка  
Дата: 24.01.12 14:45
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Сыроежка, Вы писали:


С>>Вы можете уверенно сказать, что имел в вииду автор этого прредложения? ... из кода нельззя узнать это, код об этом не говорит.


I>Из кода никогда нельзя со стопроцентной достоверностью узнать, что, где и как имел автор. Даже если он комментарий напишет, все-равно нельзя, поскольку написал-то он может одно, а поимел другое. И даже если его спросить, то ответит он одно, а поиметь может кого угодно.


Вы такое понятие, как самодокументируемый код слышали? А есть еще такоое понятие, как постоянно спотыкаться при чтении кода. Что это означает? Что при чтении кода у вас всегда возникают к нему вопросы, что без ответа на них вы не можете продвинуться дальше в чтении кода, хотя вам нужно знать лишь идею, что делает код. Вот когда в коде много местт, о которых приходится спотыкаться, как ваше предлоежение в одном месте указывать крыглые скобки у sizeof, а в другом месте нет, то такофй код тяжело читать. Это даже чисто псиихологически, когда взгляд привык к ожной какой-то конструкции, то когда он встречает новый вид конструкциии, то психологически происходит "остановка" восприятия кода. Мозг должен осознать, что перед ним новая конструкция и переработать новую иинформацию.
Меня можно встретить на www.cpp.forum24.ru
Re: Самый странный код
От: opener  
Дата: 24.01.12 15:00
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, уважаемые господа.


YLS>Есть ли у кого-то примеры кода на C/C++, который не кажется очевидным при первом взгляде на него?


YLS>Например, что-то наподобие такого:


YLS>
YLS>??=include <stdio.h>
YLS>??=define TRUE ('/'/'/')
YLS>??=define FALSE ('-'-'-')

YLS>int i;
YLS>int i = 10;

YLS>main (argc, argv)
YLS>int argc;
YLS>char *argv[];
YLS>??<
YLS>    int a??(??) = ??< [2] = 5, [9] = 3, [3] = 2 ??>;
YLS>    int value = 123;
YLS>    while (i --> 0)
YLS>    ??<
YLS>        if ((!!value or ++i) == TRUE)
YLS>        ??<
YLS>            1[a] = a??(--i, i??);
YLS>        ??>
YLS>    ??>
YLS>??>;
YLS>


А кто может объяснить что это за хрень:

??=
??<
??>


Никогда такого не видел.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.