Hippo> J'ai vraiment pas envie de répondre Point Par Point à tes Attaques Personnelles ©, si t'as un point particulier auquel tu veux que je réponde dis-le...
Hippopotame (./526) :
523> Oui, tout à fait. null est donc l'un des pointeurs, dont la valeur dépend de l'architecture, en général 0. Pas différent du reste des pointeurs, si ce n'est que les fonctions le testent.
C'est pas une question de le tester, c'est que la sémantique est radicalement différente... Justement, en bas niveau il y a quasiment aucune différence entre pointeur nul et pointeur non nul (c'est bien pour ça que c'est efficace), mais du point de vue la sémantique ça n'a rien à voir (enfin si bien sûr, ça a le même type, de même que None et Some 42). De même que dans un langage comme caml une chaîne et un tableau n'ont rien à voir, et pourtant en bas niveau ils sont représentés absolument pareil...
D'ailleurs, dans la sémantique postée par yollux, il y a probablement une erreur ou quelque chose qui va pas : une fonction comme add peut renvoyer null.
Non, add ne peut jamais renvoyer null (et l'addition en C non plus[*]). Je crois qu'en fait le malentendu vient simplement du fait que tu as une vision erronée des pointeurs C : ce n'est pas juste un entier qui se trouve correspondre à une adresse mémoire, et ça ça a plein de conséquences : p+(q-p) n'est pas forcément équivalent à q (même si p et q ont le même type). La sémantique est bien plus fine que ça, notamment pour des raisons d'efficacité et de propreté : quand tu rajoutes un entier à un pointeur, il faut que le pointeur pointe dans un certain tableau, et que le fait de rajouter cet entier ne fasse pas changer le pointeur de tableau... L'intérêt c'est que ça permet d'optimiser le code, par exemple :
int rajouter(int valeur) {
if (tableau[valeur]++ == 0)
valeurs++;
return tableau[valeur];
}
Cette sémantique garantit à l'optimiseur (ou à un outil de débuggage) que tableau[valeur] pointe bien dans "tableau"... Ca ne serait pas vrai sans la contrainte imposée sur l'addition :
rajouter(&valeurs-tableau); // interdit en CDu coup le compilo peut optimiser le code :
int rajouter(int valeur) {
int t = tableau[valeur]++;
if (t == 0)
valeurs++;
return t+1;
}
Sinon, il aurait été obligé de supposer que le "valeurs++" peut modifier tableau[valeur] et donc il aurait dû chercher encore tableau[valeur] en mémoire...
[*] bien sûr c'est tout à fait possible qu'un compilo donné le fasse, mais comme c'est une undefined behaviour le programme pourrait très bien se mettre à planter à cause de ça par la suite...