Хотя этот фрагмент кода не соответствует стандарту, gcc скомпилирует его, и результат будет соответствовать моему анализу кода.К сожалению, я не могу по-настоящему истолковать вывод без некоторого дополнительного контекста.Если я игнорирую возвраты, выходные данные выглядят примерно так:
C!o!r!s!i!...
Для анализа кода мы начнем с его небольшого форматирования:
#include <stdio.h>
char* _ ="XxTIHRCXCxTIHRXRCxTIHXHRCxTIXIHRCxTXTIHRCxXxTIHRCX";
int main(int l){
for(l+=7; l != putchar(010); ++l); // 010 = 8 -> backspace char
if(*(++_))
main(
*_ != 88 ? // *_ != 'X'
( putchar(*_ ^ 073) | putchar(33) ) & 1 : // 33 = '!'
0xffff2a8b);
}
Вот несколько вещейСтоит отметить, прежде чем мы пойдем дальше:
- Если putchar успешно, он возвращает символ, который был передан.
- В C числа, начинающиеся с 0, фактически являютсявосьмеричные, а не десятичные.Таким образом, 010 действительно является десятичным числом 8.
Теперь обратите внимание, что всякий раз, когда указатель _ выводится, он XOR с восьмеричным значением 073. Если мы применим это ко всей строке, мы получим:
cCorsixcxCorsicixCorscsixCorcrsixCocorsixCcCorsixc
Это начинает напоминать вывод, который мы видели ранее.Давайте продолжим, проанализировав несколько наиболее интересных строк:
for(l+=7; l != putchar(010); ++l); // 010 = 8 -> backspace char
Смысл этой строки - вывести серию возвратов.Если l равно 1, он выведет только один возврат.Но если он равен чему-то другому, он приходит в бешенство на свалке грузовика с символами.Поведение зависит от того, как называется main.При запуске он всегда вызывается со значением 1 (не знаю почему).
Теперь давайте посмотрим на компоненты рекурсивного основного вызова.
( putchar(*_ ^ 073) | putchar(33) ) & 1 : // 33 = '!'
Этопервая возможная ветка.Сначала он выводит один из символов XORed, а затем выводит «!»голец.Если вы посмотрите на битовую комбинацию 33, вы заметите, что (x | 33) & 1 всегда будут равны 1. Так что в этом случае мы выводим только один символ возврата в цикл for.
Вторая ветвь, с другой стороны, немного сложнее, потому что значение, переданное main, не равно 1. Если вы внимательно посмотрите на выходные данные программы, вы заметите, что она выдает загрузку задним ходом грузовика в определенном месте встрока.Без контекста я не могу точно сказать, какова цель.
Теперь, когда у нас есть все части, давайте перепишем код:
#include <stdio.h>
#define BIG_CONSTANT 42 // Not the actual value.
int main () {
char* str = "cCorsixcxCorsicixCorscsixCorcrsixCocorsixCcCorsixc";
putchar(8);
char* c = str;
while (*c != '\0') {
if (*c != 'c') { // 'X' ^ 073 = 'c'
putchar(*c);
putchar('!');
putchar(8);
}
else {
for (int i = 0; i < BIG_CONSTANT; ++i)
putchar(8);
}
c++;
}
}
Мой C немного ржавый, так чтоможет не скомпилировать / запустить.Это все еще должно дать вам хорошее представление о том, что происходит.
РЕДАКТИРОВАТЬ: Ну, я немного опоздал с публикацией своего ответа, и я только что понял, что моя консоль немного печатает backspacesбуквально вместо того, чтобы просто удалить символы.Вот почему я несколько неверно истолковал вывод.Таким образом, как сказано в принятом ответе, если вы на самом деле правильно обрабатываете backspace, он печатает Corsix!.