2015-10-12 17 views
8
char s1[] = "0"; 
char s2[] = "9"; 
printf("%d\n", strcmp(s1, s2)); // Prints -9 
printf("%d\n", strcmp("0", "9")); // Prints -1 

Perché lo strcmp restituisce valori diversi quando riceve gli stessi parametri?strcmp() restituisce valori diversi per gli stessi confronti di stringhe

Questi valori sono ancora validi poiché la pagina man di strcmp dice che il valore di ritorno di strcmp può essere inferiore, maggiore o uguale a 0, ma non capisco perché sono diversi in questo esempio.

+2

http://ideone.com/S3dYMQ se qualcuno vuole giocare ... –

risposta

4

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

3

La differenza è dovuta all'implementazione di strcmp. Finché è conforme allo (< 0, 0,> 0), non dovrebbe avere importanza per lo sviluppatore. Non puoi fare affidamento su nient'altro. Per quel che ne sai, il codice sorgente potrebbe determinare che dovrebbe essere negativo e generare casualmente un numero negativo per buttarti fuori.

Problemi correlati