для условия цикла
i["]<i;++i){--i;}"]
Это выражение использует тот факт, что индексирование массива коммутативно в C. Это эквивалентно.
"]<i;++i){--i;}"[i]
Таким образом, цикл завершается, когда символ в позиции i
равен \0
, т. Е. В конце строки длиной 14 символов (длина которой равна «здравствуйте, мир! \» п "). Таким образом, условие цикла for
можно переписать так:
i != 14
арифметика символов
read('-' - '-', i++ + "hello, world!\n", '/' / '/')
char
является целочисленным типом и, таким образом:
После исправления всех предупреждений компилятора (таких как неявное преобразование int в указатель) и упрощения вещей, упомянутых выше, код становится:
#include <unistd.h>
int i = 0;
void read2(int, char*, int);
int main()
{
while (i != 14)
{
read2(0, i++ + "hello, world!\n", 1);
}
return 0;
}
void read2(int j, char* i, int p)
{
write(j / p + p, i-- - j, 1);
}
(я переименовал read
в read2
, чтобы избежать конфликта с функцией Unix read
.)
Обратите внимание, что аргументы j
и p
для read2
не нужны, так как функция всегда вызывается с j = 0 и p = 1.
#include <unistd.h>
int i = 0;
void read2(char*);
int main()
{
while (i != 14)
{
read2(i++ + "hello, world!\n");
}
return 0;
}
void read2(char* i)
{
write(1, i--, 1);
}
Вызов write(1, i--, 1)
записывает 1 символ из i
в дескриптор файла 1 (стандартный вывод). И постдекремент является излишним, потому что эта i
является локальной переменной, на которую никогда не ссылаются снова. Так что эта функция эквивалентна putchar(*i)
.
Добавление функции read2
в основной цикл дает
#include <stdio.h>
int i = 0;
int main()
{
while (i != 14)
{
putchar(*(i++ + "hello, world!\n"));
}
return 0;
}
, для которого значение очевидно.