Extrait du cours petits secrets du C & programmation avancée
Affectations étendues
●a+=expression ≈ a=a+expression
●si l’évaluation de a contient un effet de bord, il n’est effecté qu’une fois.
● Mêmes règles de conversion de types
que pour a=a+expression
+= -= *= /= %=
<<= >>=
&= ^= |=
●Pas de &&= ni de ||=, parce que && et ||sont paresseux
●Pas de ~= ni de !=, parce que ~ et ! sont unaires
Labels et sauts
●label=identificateur suivi par :
●on peut y sauter avec goto label;
●le gotoet le label doivent être dans la même fonction, mais pas forcément dans le même bloc
●le label peut être avant le goto
●le label doit précéder une instruction
L’unique exception
●Gestion d’erreurs multiples:
int main(int argc,char* argv[]) {
if (argc!=3) goto end;
FILE* f=fopen(argv[1], »r »);
if (f==NULL) goto end;
FILE* f2=fopen(argv[2], »w »);
if (f2==NULL) goto close_f;
int* buffer=(int*)malloc(N*sizeof(int));
if (buffer==NULL) goto close_f2;
if (!test(f2)) goto free_buffer;
/* do the job */
free_buffer: free(buffer);
close_f2: fclose(f2);
close_f: fclose(f);
end: /* … */
return 0;
}
Les fonctions imbriquées
●Interdites en C ISO
●N’apportent rien, donc à proscrire
intmain(intargc,char* argv[]) {
voidhello_world() {
printf(« Hello world !\n »);
}
hello_world();
return0;
}
$>gcc -Wall -ansi –pedantic-errors nested.c
nested.c: In function `main’:
nested.c:9: ISO C forbids nested functions
……….
Cours petits secrets du C & programmation avancée (Cours PDF)