Salut, pourriez vous m'expliquer pourquoi il met un 0[...] = 0.
je ne sais pas a quoi cq correspond
Code:0[result = xmalloc(SIZE_BUFFER)] = 0;
Version imprimable
Salut, pourriez vous m'expliquer pourquoi il met un 0[...] = 0.
je ne sais pas a quoi cq correspond
Code:0[result = xmalloc(SIZE_BUFFER)] = 0;
Ça correspond à ceci:
Les deux syntaxes ptr[index] et index[ptr] sont autorisées par le langage.Code:(result = xmalloc(SIZE_BUFFER)[0] = 0;
Personnellement, j'aurais simplement utilisé:
Je trouve ceci plus compréhensible.Code:*(result = xmalloc(SIZE_BUFFER) = 0;
ok merci pour ton aide medinoc
Ca, c'est du vrai code de chacal !Citation:
Envoyé par Pitou5464
L'arithmétique des pointeurs et la commutativité de l'opérateur + permet des choses étranges comme :
Dont le code que tu as montré est une autre forme de :Code:p[i] = *(p + i) = *(i + p) = i[p]
Code:
1
2
3 T* result = xmalloc(SIZE_BUFFER); result[0] = 0;
enfin c clair que c etrangeCode:p[i] = *(p + i) = *(i + p) = i[p];
Wouahhhhhh..........En effet, ça c'est vraiment très étrange comme syntaxe (et même déroutant) que je ne connaissais absolument pas.Citation:
Envoyé par Emmanuel Delahaye
Comme quoi on en apprends tous les jours, même après 15 ans de développement en langage C.
PS : Je trouve ce forum de plus en plus génial.
extrait de l'IOCCC:
suivant votre compilateur, il faut declarer ou pas unix.Code:
1
2
3
4
5
6
7
8 #include <stdio.h> int main() { //int unix; printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60); return 0; }
:aie:
(on trouve des explications detaillées sur ce code en fouinant sur google, j'ai decouvert parce que c'est tombé au partiel de C l'an dernier a mon ecole ...)
---
ajout explications claires et completes: http://www.di-mgt.com.au/src/korn_ioccc.txt
Pour être précis, ça dépend de la plate-forme, "unix" est supposé être un #define qui vaut 1 sous UNIX...
Donc pour moi, ce n'est déjà plus du C standard.
- &unix["\021%six\012\0"] vaut donc &"\021%six\012\0"[1],
ce qui s'affichera en tant que "%six\n".- (unix)["have"]+"fun"-0x60 vaut donc ("have"[1]-('a'-1))+"fun" c'est-à-dire "fun"+1,
ce qui s'affichera en "un".
'a' = 0x61.Citation:
Envoyé par Médinoc
("have"[1]-0x60)+"fun" => ('a'-0x60)+"fun" => (0x61-0x60)+"fun" => 1+"fun" => &"fun"[1]
Merci, corrigé. :)
PS: 1+"fun" donne &fun[1]
<HORS-SUJET>
Il y a quelques rares applications interessantes pour p[i] <-> i[p].
Par exemple, dans cette fonction qui retourne la representation d'un nombre dans une base de 2 a 16, on utilise cette propriete pour acceder facilement au bon symbole :
(fonction donnee dans la FAQ CLC).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 char *baseconv(unsigned int num, int base) { static char retbuf[sizeof (int) + CHAR_BIT + 1]; char *p = NULL; if (base > 1 && base < 17) { p = &retbuf[sizeof(retbuf)-1]; *p = '\0'; do { *--p = "0123456789abcdef"[num % base]; num /= base; } while(num != 0); } return p; }
Je trouve ca propre...
</HORS-SUJET>
Ben là, je ne vois que du classique p[i]...
Pas un seul i[p] en vue, ou alors il faut que je me rachète des yeux...
Tes yeux vont tres bien, c'est moi qui suis hors-sujet. Je l'indique. Sorry about that!Citation:
Envoyé par Médinoc