Приведу пример двух программ которые печатают "Hello, World!" на экран:
%:include<stdio.h>
main()<%char*a<::>=<%"Hello,World!",0%>;puts(a<:(int)a<:1:>:>);%>
#include<stdio.h>
int main()
{
puts((char<::>)<%<:0x8:>=0x6F,<:0xA:>=0x6C,<:0x9:>=0x72,<:0x0:>=0x48,
<:0x6:>=0x20,<:0x2:>=0x6C,0x6C,<:0x4:>=0x6F,<:0x1:>=0x65,<:0x5:>=0x2C,
<:0xB:>=0x64,<:0x7:>=0x57,<:0xC:>=0x21,0x00%>);
}
В обоих примерах используются так называемые диграфы, это пара символов призванная заменить один, их использование вполне допустимо в языке Си и тесно связано с его происхождением. Когда язык Си появился на свет, имелись клавиатуры на которых отсутствовали символы '{', '}', '[', ']', '#' и бог его знает какие еще. Но, как известно, эти символы широко используются в языке Си и, чтобы не ущемлять права владельцев подобных "клав" в стандарт были введены диграфы, которые позволяли заменить эти символы на пару других, например '{' и '}' заменяются на '<%' и '%>', а '[' и ']' заменяются на '<:' и ':>', а также '#' заменяется на '%:'. Кончено, в наше время это кажется странным, но из стандарта диграфы так и не ушли.
И если с первым примером все становится более-менее ясно, то вот второй, даже после "исправления" диграфов, кажется странным. Тут все дело в стандарте C99. Дело в том, что там позволяется делать интересные вещи: объявлять безымянные массивы и посылать их в функцию, а также явно задавать положение элементов в объявленном массиве. Т.е. конструкция (char[]){1, 2, 3, 4, 5} есть не что иное как массив, тот же самый результат даст конструкция (char[]){[1]=2, [0]=1, [2]=3, 4, 5}. Вот теперь все должно встать на свои места :)
Удачного кодинга!
Casino Hotel Las Vegas - MapYRO
ОтветитьУдалитьHotel in Las 순천 출장샵 Vegas Strip district. Address: 3475 S. 속초 출장마사지 Las 동두천 출장마사지 Vegas Blvd, Las Vegas, NV 안양 출장샵 89109. Phone: 서산 출장안마 702-385-7575. Fax: 702-385-4525