Suppongo che si stia utilizzando GCC durante la compilazione, l'ho provato su 4.8.4. Il trucco qui è che GCC comprende la semantica di alcune funzioni di libreria standard (strcmp
è una di queste). Nel tuo caso, il compilatore eliminerà completamente la seconda chiamata strcmp
, perché sa che il risultato delle costanti di stringa "0"
e "9"
sarà negativo e verrà utilizzato un valore compatibile standard (-1) anziché effettuare la chiamata. Non può fare lo stesso con la prima chiamata, perché s1
e s2
potrebbero essere stati modificati in memoria (immagina un interrupt, o più thread, ecc.).
È possibile eseguire un esperimento per convalidarlo. Aggiungere il qualificatore const
agli array per far GCC sanno che non possono essere modificati:
const char s1[] = "0";
const char s2[] = "9";
printf("%d\n", strcmp(s1, s2)); // Now this will print -1 as well
printf("%d\n", strcmp("0", "9")); // Prints -1
Potete anche guardare l'output assembler formare il compilatore (utilizzare il flag -S
).
Il modo migliore per controllare è comunque utilizzare -fno-builtin
, che disabilita questa ottimizzazione. Con questa opzione, il tuo codice originale stamperà -9 in entrambi i casi
fonte
2015-10-12 22:58:35
http://ideone.com/S3dYMQ se qualcuno vuole giocare ... –