J'oubliais: le c est plein de petit trucs a la con qui sont tout sauf simple, et la plupart dérivent de son typage faible et des regles implicites de conversion a la con qu'il faut connaitre par coeur sous peine de passer qq heures a debugger comme un con.
Pourquoi BOOL test = 1024; if(!test) printf("ah ben ca va moins bien marcher, forcemment!"); imprime la celebre replique de bourvil?
Pourquoi est ce que BOOL accepte qq chose different de true/false d'ailleurs?
Une fois que t'as la reponse a ca, pourquoi est ce que
BOOL function1() {
int i = 0;
i = 4;
}
NSInteger function2() {
int i = 0;
i = 4;
}
NSLog(@"%i %i", function1(), function2());
imprimes 0 70 sur x86 en -O0 et 0 32578593 en -Os (et probablement autre chose sur arm, j'en sais rien, pas essaye)? Pourquoi est ce que la sortie varie en fonction de la ou je place mon NSLog?
Pourquoi est ce que ca compile tout court d'ailleurs?
Perso, j'ai les reponses, mais je suis a peu pres sur qu'une proportion non negligeable de ceux qui ecrivent du C en entreprise n'ai pas le moindre debut d'idée (et pour la premiere question, je me serais fait baise en beauté si j'etais pas tombe par hasard sur une ML qui traitait du sujet recemment).
Pourquoi est ce que int myVar = 42 + (i > 0); donne 43 si i = 1? C'est pas tres intuitif d'avoir un concept d'addition d'un nombre et d'un booleen, c'est un peu comme additioner des choux et des carottes. Meme si une fois que t'as admis que les booleens n'existent pas, c'est foutrement pratique, j'en conviens (enfin, jusqu'a ce que t'essaye d'assigner 128+ a un bool et que ca te pete a la gueule, evidemment).
Et d'ailleurs:
int i = 4000000000;
int var = 42 + (i > 0);
NSLog(@"%i", var);
Combien de dev vont te dire que ca imprime 43? Pourquoi diable est ce que ca compile quand i ne peut de toutes facons pas tenir 4 milliards?
Tiens, une autre rigolote aussi:
int *a = malloc(4*sizeof(char));
NSLog(@"%i %i %i", a, a+1, ((int)a)+1)
M'imprime 202493552 202493556 202493553, tu trouves ca simple toi?
Ya une difference avoir une specification stricte (encore que, le undefined behavior, comme specification…) et simple.
Java ne souffre d'aucun des defauts cites plus haut: tout est logique et formellement spécifie (et venez pas me sortir le seul contre exemple avec l'autoboxing des Integer, il est specifie lui aussi…). Bon il est objet pur, et c'est clairement pas le mieux pour commencer, mais j'irais pas jusqu'a dire que C est simple. Pascal me parait beaucoup plus simple pour commencer.
[^] # Re: Mon grain de sel
Posté par groumly . En réponse au journal Lycée et informatique : spécialité ISN en terminale S. Évalué à 10.
J'oubliais: le c est plein de petit trucs a la con qui sont tout sauf simple, et la plupart dérivent de son typage faible et des regles implicites de conversion a la con qu'il faut connaitre par coeur sous peine de passer qq heures a debugger comme un con.
Pourquoi BOOL test = 1024; if(!test) printf("ah ben ca va moins bien marcher, forcemment!"); imprime la celebre replique de bourvil?
Pourquoi est ce que BOOL accepte qq chose different de true/false d'ailleurs?
Une fois que t'as la reponse a ca, pourquoi est ce que
BOOL function1() {
int i = 0;
i = 4;
}
NSInteger function2() {
int i = 0;
i = 4;
}
NSLog(@"%i %i", function1(), function2());
imprimes 0 70 sur x86 en -O0 et 0 32578593 en -Os (et probablement autre chose sur arm, j'en sais rien, pas essaye)? Pourquoi est ce que la sortie varie en fonction de la ou je place mon NSLog?
Pourquoi est ce que ca compile tout court d'ailleurs?
Perso, j'ai les reponses, mais je suis a peu pres sur qu'une proportion non negligeable de ceux qui ecrivent du C en entreprise n'ai pas le moindre debut d'idée (et pour la premiere question, je me serais fait baise en beauté si j'etais pas tombe par hasard sur une ML qui traitait du sujet recemment).
Pourquoi est ce que int myVar = 42 + (i > 0); donne 43 si i = 1? C'est pas tres intuitif d'avoir un concept d'addition d'un nombre et d'un booleen, c'est un peu comme additioner des choux et des carottes. Meme si une fois que t'as admis que les booleens n'existent pas, c'est foutrement pratique, j'en conviens (enfin, jusqu'a ce que t'essaye d'assigner 128+ a un bool et que ca te pete a la gueule, evidemment).
Et d'ailleurs:
int i = 4000000000;
int var = 42 + (i > 0);
NSLog(@"%i", var);
Combien de dev vont te dire que ca imprime 43? Pourquoi diable est ce que ca compile quand i ne peut de toutes facons pas tenir 4 milliards?
Tiens, une autre rigolote aussi:
int *a = malloc(4*sizeof(char));
NSLog(@"%i %i %i", a, a+1, ((int)a)+1)
M'imprime 202493552 202493556 202493553, tu trouves ca simple toi?
Ya une difference avoir une specification stricte (encore que, le undefined behavior, comme specification…) et simple.
Java ne souffre d'aucun des defauts cites plus haut: tout est logique et formellement spécifie (et venez pas me sortir le seul contre exemple avec l'autoboxing des Integer, il est specifie lui aussi…). Bon il est objet pur, et c'est clairement pas le mieux pour commencer, mais j'irais pas jusqu'a dire que C est simple. Pascal me parait beaucoup plus simple pour commencer.