Самый странный код
От: 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>


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

??=
??<
??>


Никогда такого не видел.
Re[2]: Самый странный код
От: Ops Россия  
Дата: 24.01.12 16:35
Оценка:
Здравствуйте, opener, Вы писали:

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


O>
O>??=
O>??<
O>??>
O>


O>Никогда такого не видел.



Google: триграф
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Самый странный код
От: Banned by IT  
Дата: 24.01.12 17:38
Оценка: :)))
Здравствуйте, opener, Вы писали:

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


O>
O>??=
O>??<
O>??>
O>


O>Никогда такого не видел.


Эта панимаш тяжкое наследие царского режиму: http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D1%80%D0%B0%D1%84_%28%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8_C%D0%B8%29
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Самый странный код
От: Masterkent  
Дата: 24.01.12 18:12
Оценка:
Banned by IT:

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


O>>
O>>??=
O>>??<
O>>??>
O>>


O>>Никогда такого не видел.


BBI>Эта панимаш тяжкое наследие царского режиму: http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D1%80%D0%B0%D1%84_%28%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8_C%D0%B8%29


Кстати, было время, когда триграфы в C++ хотели сделать deprecated, но потом передумали:
Issue 789. Deprecating trigraphs
Re: Самый странный код
От: MasterZiv СССР  
Дата: 24.01.12 18:18
Оценка:
Расскажу я вам историю о страшном-странном коде.

В одном чёрном-чёрном городе был чёрный чёрный университет.
В этом чёрном-чёрном университете был чёрный-чёрный корпус...

ну и так далее.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Самый странный код
От: YourLastSong  
Дата: 24.01.12 18:37
Оценка:
O>Известная прожка, печатает стихи.

Спасибо.

А где-нибудь есть объяснение? Некоторые моменты просто не могу понять никак.
Re[4]: Самый странный код
От: Banned by IT  
Дата: 24.01.12 21:06
Оценка: 1 (1) +3
Здравствуйте, Masterkent, Вы писали:

M>Кстати, было время, когда триграфы в C++ хотели сделать deprecated, но потом передумали:

M>Issue 789. Deprecating trigraphs

Зря передумали ИМХО.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Самый странный код
От: YourLastSong  
Дата: 24.01.12 21:39
Оценка:
O>
O>main (int t, int _, char *a)


А почему аргументов три, при этом по стандарту требуется либо void, либо два?
Re: Самый странный код
От: Sir-G  
Дата: 25.01.12 04:10
Оценка:
Здравствуйте, YourLastSong, Вы писали:

Начнем с классики. Программа, написанная Диком Т. Винтером (Dik T. Winter at CWI) на Си всего 160-ю символами, но вычисляющая 800 знаков Пи.


int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f*a, f=d%--g,d/=g--,--b;d*=b);}
Re[6]: Самый странный код
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 25.01.12 05:53
Оценка:
Здравствуйте, igna, Вы писали:

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


I>Для однообразия с sizeof нечего применять скобки и с sizeof тоже


А я вот совершенно случайно (и относительно недавно) обнаружил что с sizeof можно не юзать скобки

Сказал "нунадаже!" и все равно продолжил их юзать.

А в последнее время вообще, даже стараюсь их везде юзать. Типа (a+(b*c)).

--
Но я вот одно понять не могу
int foo(int x) {
  if (x) {
    return (-1);
  }
  else {
    return (0);
  }
}

Нафига тут "else"?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Самый странный код
От: RonWilson Россия  
Дата: 25.01.12 06:05
Оценка:
Здравствуйте, RonWilson, Вы писали:

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


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


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


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



int func(void)
{
return 0;
}


зачем тут void?
Re[3]: Самый странный код
От: steep8  
Дата: 25.01.12 07:28
Оценка:
Здравствуйте, RonWilson, Вы писали:


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


RW>зачем тут void?


Остатки C-style ?
Re[4]: Самый странный код
От: RonWilson Россия  
Дата: 25.01.12 07:29
Оценка:
Здравствуйте, steep8, Вы писали:

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



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


RW>>зачем тут void?


S>Остатки C-style ?


может быть, но пишут и сейчас такое
Re[5]: Самый странный код
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 25.01.12 07:49
Оценка:
Здравствуйте, RonWilson, Вы писали:

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


RW>>>зачем тут void?


S>>Остатки C-style ?


RW>может быть, но пишут и сейчас такое


Это остатки C-кодеров
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[6]: Самый странный код
От: RonWilson Россия  
Дата: 25.01.12 09:08
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

S>>>Остатки C-style ?


RW>>может быть, но пишут и сейчас такое


КД>Это остатки C-кодеров


или огарки?
Re: Самый странный код
От: opener  
Дата: 25.01.12 09:29
Оценка:
Здравствуйте, YourLastSong, Вы писали:

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


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


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


Программа, печатающая саму себя.

char *f="char *f=%c%s%c;%c#define Q '%c'%c#define N '%cn'%c#define B '%c%c'%c#include <stdio.h>%cvoid main(){printf(f,Q,f,Q,N,Q,N,B,N,B,B,N,N,N);}%c";
#define Q '"'
#define N '\n'
#define B '\\'
#include <stdio.h>
void main(){printf(f,Q,f,Q,N,Q,N,B,N,B,B,N,N,N);}
Re[3]: Самый странный код
От: Privalov  
Дата: 25.01.12 10:50
Оценка:
Здравствуйте, YourLastSong, Вы писали:

O>>
O>main (int t, int _, char *a)


YLS>А почему аргументов три, при этом по стандарту требуется либо void, либо два?


MSDN объясняет.

А согласно Вики, можно и больше (иногда). Вики ссылается сюда.

// Compile with: gcc -o apple apple.c
#include <stdio.h>
int main(int argc, char *argv[], char *envp[], char *apple[]) {  
    printf("argv[0] = %s\n", argv[0]);  
    printf("apple[0] = %s\n", apple[0]);  
    return 0;
}


Такого я в реальном коде не видел.
Re[2]: Самый странный код
От: johny5 Новая Зеландия
Дата: 25.01.12 10:58
Оценка:
PD>http://rsdn.ru/forum/philosophy/2445064.1.aspx
Автор: Pavel Dvorkin
Дата: 12.04.07



#include <stdio.h>
#include <stdlib.h>

int v,w,Y= -1,W,J,p,F,o=9999,M,N,K,X,YY,_,P[9999],s();
typedef int(*L)();
L q[9999];

tj()
{
    int S=(v<0?-1:!!v)+((w<0?-1:!!w)<<K);
    if(!S)return J;
    for(v=W+S;
        v!=J&&!q[v];
        v+=S);
    return v;
}

k()
{
    _=K;
    return v?(v<0?-v:v)>1||w-Y||!q[J]:(w-Y&&(w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/ 2))||q[J];
}

z()
{
    _=5;
    return v*w||tj()-J;
}

e()
{
    _= -2;
    return(v*v*v-v||w*w*w-w)&&(J-W-2||(W&N)-4||(W>>K!=(Y-1?N:0))|| q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*Y<0);
}

double VR()
{
    int PZ=0x7fff;
    return(double)(rand()&PZ)/(double)PZ;
}

l()
{
    _=K+1;
    return(v*w&&(v<0?-v:v)-(w<0?-w:w))||tj()-J;
}

double UC()
{
    double i=0, d;

    while((i+=d=VR())<1.0)
        ;

    return d;
}

c()
{
    _= -11;
    return (v<0?-v:v)-(w<0?-w:w)||tj()-J;
}

I(ur,n,x)
{
    W=ur;
    J=n;
    if(P[W]!=Y||P[J]==Y)
        return J+1;

    v=(J&N)-(W&N);
    w=(J>>K)-(W>>K);

    return q[W]()||(x&&QL(W,J,s));
}

TT(W)
{
    v=w=0;
    return q[W]()+K;
}

s()
{
    int j= -1,i;
    Y= -Y;

    for(i=0; i<M; ++i)
    {
        if(j<0&&P[i]== -Y&&TT(i)&&_== -2)
        {
            j=i;
            i= -1;
        }
        else if(j>=0&&!I(i,j,0))
            return Y= -Y;
    }

    return!(Y= -Y);
}

bb()
{
    _=1;
    return (v*w<0?-v*w:v*w)-2;
}
uv()
{

    for(v=0;
        v<9999;
        ++v)
    {
        if(((v>>K)<=K?v>>K:N-(v>>K))==0)
        {
            int S=((v&N)<=K?v&N:N-(v&N));

            q[v]=!S?z:(S==1?bb:(S==2?c:(v&N>K?l:e)));
        }
        else if(((v>>K)<=K?v>>K:N-(v>>K))==1)q[v]=k;
        else q[v]=0;

        P[v]=!!q[v]*(28-v);
    }
}
y()
{
    int G=Y,i;
    J=0;
    for(i=0;i<M;++i)
    {

        i%8||printf("\n%4o ",i);
        if((Y=P[i]=(P[i]<0?-1:!!P[i]))&& TT(i))printf("%c ",_+93+Y*16);
        else printf("- ");
    }

    printf("\n    ");
    do printf("%2d",i++&N);
    while(i&N);
    Y=G;
    printf("\n");
}
O(W,J)
{

    if((q[J]=q[W])==k&&((J>>K)<=K?J>>K:N-(J>>K))==0)q[J]=l;
    if(q[W]==e)if(J-W==2)O(J+1,J-1);
    else
        if(W-J==2)O(W-1,W+1);
    P[J]=P[W];
    q[W]=0;
    P[W]=0;
}
QL(W,J,D)L D;

{
    int
        HQ=P[J],YX;
    L AJ=q[J],XY=q[W];
    O(W,J);
    YX=D();
    O(J,W);
    q[J]=AJ;
    q[W]=XY;

    P[J]=HQ;
    return YX;
}
C()
{
    int i,j,BZ=0;
    for(i=0;i<M;++i)
    {
        L Z=q[i];
        if(Z)
        {
            int
                r=((i>>K)<=K?i>>K:N-(i>>K))+((i&N)<=K?i&N:N-(i&N)),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]<0?N-(i>>K):(i>>K)):
                (Z==l?124-((YY<8&&((i&N)!=K|| (i>>K)!=(P[i]>0?0:N)))?M:0):
                (Z==c?41+r:(Z==e?9999-r-r:36+r+r))));
            Y=P[i];
            for(j=0;
                j<M;

                ++j)if(!I(i,j,0))S+=(P[j]?5:1);
            BZ+=G==Y?S:-S;
            Y=G;
        }
    }

    if(!(++X&M-1))write(1,".",1);
    return BZ;
}
PX()
{
    int i,Q=0,XP=0,JZ=M*M,E= -9999,t,S=o;

    if(!F--)return++F+C();
    for(i=0; i<JZ; ++i)
        if(!I(i>>K+K,i&M-1,1))
        {
            Y= -Y;
            o= -E;
            t=
                -QL(i>>K+K,i&M-1,PX);
            Y= -Y;
            if(t>E)
            {
                ++XP;
                Q=i;
                E=t;
                if(E>=S) return++F,E;
            }
        }

        if(!XP)E=s()?-9999+1:0;
        p=Q;
        return++F,E;
}
RZ()
{
    int i,j,T=0;
    for(;
        ;
        )
    {
        y();
        o=9999;
        do
        {

            printf("\n%d %d %d %s ",X,T,C(),s()?"!":">");
            fflush((&__iob_func()[1]));
        }

        while(scanf("%o%o",&i,&j)!=2||I(i,j,1));
        O(i,j);
        y();
        X=0;
        ++YY;
        Y= -Y;
        T=PX();

        i=p>>(K<<1);
        j=p&(M-1);
        if(I(i,j,1))
        {
            printf("Rats!\n");
            return;
        }
        O(i,j);
        Y= -Y;

        if(T>M*M)printf("\nHar har.\n");
    }
}

main(ac,av)char**av;
{
    long time(),j=time(&j);

    double i=0;
    srand((int)j);
    for(M=0; M<=9999; ++M)
        i+=UC();
    M=i/100;
    if(M&3)++M;
    if(M&1)--M;

    for(N=1; N*N<M; ++N)
        ;

    K= --N/2;
    F=ac>1?atoi(av[1]):2;
    uv();
    RZ();
}


Кто дальше?
Re[2]: Самый странный код
От: Sir-G  
Дата: 25.01.12 11:04
Оценка:
Здравствуйте, opener, Вы писали:

O>Программа, печатающая саму себя.

Программы, выводящие свой исходный код называются куайны:
http://en.wikipedia.org/wiki/Quine_(computing)

По ссылке на Вики еще есть интересная вещь, когда программа на C++ печатает программу на Java, которая потом печатает снова тот же C++ код. Есть и более длинные циклы по языкам.
Re: Самый странный код
От: Sir-G  
Дата: 25.01.12 11:06
Оценка: 1 (1) :)
Здравствуйте, YourLastSong, Вы писали:

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

В стандарте C++11 появились лямбда-выражения, например
[] (int x) { std::cout << x << std::endl; } (5);

Следующий код успешно компилируется в 10-ой студии:
[](){}();[]{[]{}();}();
Re[7]: Самый странный код
От: B0FEE664  
Дата: 25.01.12 11:18
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>--

КД>Но я вот одно понять не могу
КД>
КД>int foo(int x) {
КД>  if (x) {
КД>    return (-1);
КД>  }
КД>  else {
КД>    return (0);
КД>  }
КД>}
КД>

КД>Нафига тут "else"?

И зачем тут if? :

int foo(int x) {  return x ? -1 : 0; }
И каждый день — без права на ошибку...
Re[2]: Самый странный код
От: Sir-G  
Дата: 25.01.12 11:19
Оценка:
Здравствуйте, opener, Вы писали:

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

Забавно, та еще муть!
У меня только почему-то в первой строке слово first с разрывом идет (после 'f' нулевой байт). Это by design?
Re: Самый странный код
От: IROV..  
Дата: 25.01.12 14:33
Оценка: 4 (1)
Здравствуйте, YourLastSong, Вы писали:

int main()
{
    int j = 0;

    //этот цыкл считает до 10??????????????/
    for( int i = 0; i != 10; ++i )
    {
        ++j;
    }

    printf("%d", j);
}


я не волшебник, я только учусь!
Re[3]: Самый странный код
От: opener  
Дата: 25.01.12 16:11
Оценка:
Здравствуйте, Sir-G, Вы писали:

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


O>>Программа, печатающая саму себя.

SG>Программы, выводящие свой исходный код называются куайны:
SG>http://en.wikipedia.org/wiki/Quine_(computing)

SG>По ссылке на Вики еще есть интересная вещь, когда программа на C++ печатает программу на Java, которая потом печатает снова тот же C++ код. Есть и более длинные циклы по языкам.


Где-то (на Хабре, кажется), видел квайн на пять языков. Навскидку не могу найти.
Re[11]: Самый странный код
От: Vain Россия google.ru
Дата: 25.01.12 19:43
Оценка:
Здравствуйте, Сыроежка, Вы писали:

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

Какую? Скобки перед sizeof/return? А как вы вообще собираетесь в команде работать если вас уже при чтении каких-то скобок начались проблемы с фосприятием важной и не важной инфы? И, о страшно подумать, что с вами будет если вдруг стандарты форматирования в компании расходятся с вашими хотелками?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Самый странный код
От: Sir-G  
Дата: 26.01.12 04:41
Оценка:
Здравствуйте, johny5, Вы писали:

J>Кто дальше?

Круто развернулось!!! =)
Интересно, зачем там нужны случайные числа?
Re[4]: Самый странный код
От: Sir-G  
Дата: 26.01.12 04:47
Оценка:
Здравствуйте, opener, Вы писали:

O>Где-то (на Хабре, кажется), видел квайн на пять языков. Навскидку не могу найти.

А вот немного другая тема. Программа "hello world", но работающая на 15 языках.
Re: Самый странный код
От: B0FEE664  
Дата: 26.01.12 09:57
Оценка:
Здравствуйте, YourLastSong, Вы писали:

А что означает запись '[2] = 5' в этой строке:
YLS> int a??(??) = ??< [2] = 5, [9] = 3, [3] = 2 ??>;

Это С или С++? И какого стандарта ?
И каждый день — без права на ошибку...
Re[2]: Самый странный код
От: Sir-G  
Дата: 27.01.12 04:43
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


BFE>А что означает запись '[2] = 5' в этой строке:

YLS>> int a??(??) = ??< [2] = 5, [9] = 3, [3] = 2 ??>;

BFE>Это С или С++? И какого стандарта ?

Я, кстати, пытался засунуть в вижуал студию этот пример ТС. Не компилируется ни как C, ни как C++.
Re: Самый странный код
От: Sir-G  
Дата: 27.01.12 04:51
Оценка: +1 :))
Здравствуйте, YourLastSong, Вы писали:

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

Можно вставить URL в текст программы, это скомпилируется.

int main()
{
    http://www.rsdn.ru/forum/cpp
    return 0;
}
Re[3]: Самый странный код
От: Were  
Дата: 27.01.12 09:12
Оценка:
Здравствуйте, Sir-G, Вы писали:

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


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


BFE>>А что означает запись '[2] = 5' в этой строке:

YLS>>> int a??(??) = ??< [2] = 5, [9] = 3, [3] = 2 ??>;

BFE>>Это С или С++? И какого стандарта ?

SG>Я, кстати, пытался засунуть в вижуал студию этот пример ТС. Не компилируется ни как C, ни как C++.
В gcc надо засовывать.
Re: Самый странный код
От: lxa http://aliakseis.livejournal.com
Дата: 27.01.12 09:56
Оценка:
Здравствуйте, YourLastSong, Вы писали:

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


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


Оказывается, этот код бывает неочевиден при первом взгляде на него.

В свое оправдание могу сказать, что использование Duff's device действительно давало эффект
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.