Pour la condition de boucle
i["]<i;++i){--i;}"]
Cette expression tire parti du fait que l'indexation des tableaux est commutative en C. Elle est équivalente à .
"]<i;++i){--i;}"[i]
Ainsi, la boucle se terminera lorsque le caractère en position i
est \0
c'est-à-dire à la fin de la chaîne, qui compte 14 caractères (ce qui se trouve être la même longueur que "hello, world ! \n "). Ainsi, le for
La condition de boucle peut être réécrite comme suit :
i != 14
arithmétique des caractères
read('-' - '-', i++ + "hello, world!\n", '/' / '/')
char
est un type entier, et donc :
Après avoir corrigé tous les avertissements du compilateur (comme la conversion implicite de int en pointeur), et simplifié les choses mentionnées ci-dessus, le code devient :
#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);
}
(J'ai renommé read
à read2
pour éviter tout conflit avec le système Unix read
fonction.)
Notez que le j
et p
arguments pour read2
ne sont pas nécessaires, car la fonction est toujours appelée avec j=0 et 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);
}
L'appel write(1, i--, 1)
écrit 1 caractère de i
vers le descripteur de fichier 1 (stdout). Et la post-décrémentation est superflue parce que ce i
est une variable locale qui ne sera plus jamais référencée. Cette fonction est donc équivalente à putchar(*i)
.
Mise en ligne de la read2
dans la boucle principale donne
#include <stdio.h>
int i = 0;
int main()
{
while (i != 14)
{
putchar(*(i++ + "hello, world!\n"));
}
return 0;
}
dont le sens est évident.