2015-04-25 5 views
3

я столкнулся следующий кодкод запутывания не понимаю

#include <stdio.h> 

int main(void) 
{ 
    long long P = 1,E = 2,T = 5,A = 61,L = 251,N = 3659,R = 271173410,G = 1479296389, 
       x[] = { G * R * E * E * T , P * L * A * N * E * T }; 
    puts((char*)x); 
    return 0; 
} 

Дело в том, я не совсем понимаю, как это работает, это очень запутанной для меня. Может кто-то, пожалуйста, объясните это подробно?

Редактировать: Еще одна вещь, как напечатать «Hola mundo!» («Привет мир» на испанском языке) аналогично?

+9

Вычислить 'G * R * E * E * T' и' P * L * A * N * E * T' и посмотреть, как их последовательность байт выглядит. – GSerg

+0

@GSerg Не понимаю – Kevin

+2

@Tony, _how сделать print hello world in Spanish_ 'printf (" hola mundo ");' –

ответ

8

О, это весело. Очевидно, вы объявляете много переменных long long и один массив 2 из 2-х ячеек. Поэтому массив состоит из 16 байтов.

Учитывая, что каждый байт является одним символом ASCII, массив представляет 16 символов (в то время как последний, вероятно, равен нулю). Вы можете видеть, что:

G * R * E * E * T = 1479296389 * 271173410 * 2 *2 * 5 = 8022916924116329800 = 
0x6F57206F6C6C6548 

P * L * A * N * E * T = 1 * 251 * 61 * 3659 * 2 * 5 = 560229490 = 
0x21646C72 

Учитывая, что ваш процессор Little Endian, в памяти представление массива является:

48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 00 00 00 

Что в ASCII Hello World!\x00\x00\x00\x00.

+0

Перекрестная ссылка: http://codegolf.stackexchange.com/a/22596 – GSerg

+0

@Mark Segal отличный ответ, только вопрос, как печать на испанском языке – Kevin

+0

@Tony - выход этой программы - «Hello World!» - точно так же, как напечатано. https://ideone.com/d2RLuR –

2

Вот испанский вариант:

int main(void) 
{ 
    int T=1, E=2, R=2, A=31, Q=784, L=70684, I=6590711, U=1181881, 
     x[] = { T*I*E*R*R*A, Q*U*E, T*A*L }; 

    puts((char *) x); 

    return 0; 
} 
Смежные вопросы