Salut, pourriez vous m'expliquer pourquoi il met un 0[...] = 0.
je ne sais pas a quoi cq correspond
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0[result = xmalloc(SIZE_BUFFER)] = 0;
Salut, pourriez vous m'expliquer pourquoi il met un 0[...] = 0.
je ne sais pas a quoi cq correspond
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0[result = xmalloc(SIZE_BUFFER)] = 0;
Ça correspond à ceci:
Les deux syntaxes ptr[index] et index[ptr] sont autorisées par le langage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (result = xmalloc(SIZE_BUFFER)[0] = 0;
Personnellement, j'aurais simplement utilisé:
Je trouve ceci plus compréhensible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part *(result = xmalloc(SIZE_BUFFER) = 0;
Ca, c'est du vrai code de chacal !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 : Sélectionner tout - Visualiser dans une fenêtre à part p[i] = *(p + i) = *(i + p) = i[p]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 T* result = xmalloc(SIZE_BUFFER); result[0] = 0;
enfin c clair que c etrange
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
![]()
(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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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!Envoyé par Médinoc
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager