2010-01-13 5 views

Répondre

10

C spécifie les conversions standard pour différents types. Les règles sont un peu complexes, mais fondamentalement le type "plus petit" est temporairement converti en type plus grand, donc si vous comparez un int avec un char, le char sera converti en int, uniquement pour les besoins de la comparaison.

+3

Le jargon pour cela est « les conversions arithmétiques habituelles », que vous pouvez trouver dans l'index * Le langage de programmation C * par Kernighan et Ritchie. La seule surprise est que parfois un opérande signé est promu à un type non signé parce que l'autre opérande est non signé, donc un grand '' '' '' '' 'non signé '' positif positif peut être considéré comme moins qu'un 'int' négatif. –

+1

L'autre règle est que l'arithmétique (y compris les comparaisons) n'est jamais faite sur les types plus petits que 'int', donc si vous comparez un' char' avec un 'char', ils seront * tous les deux * promus' int' . – caf

1

Selon la norme C99, les opérandes suivants sont autorisés pour tout opérateur relationnel:

  • deux opérandes avec de vrais types arithmétiques
  • deux pointeurs vers des objets du même type

En le premier cas, différents types seront convertis selon le usual arithmetic conversions.

0

Comme l'a dit Jason dans l'un des commentaires, vous devez faire attention avec les types non signés. Par exemple, les impressions de code suivants sur concassés:

#include <stdio.h> 

int main() { 
    int a = -1; 
    unsigned int b = 1 << 31; 

    if (a < b) { 
    fprintf(stderr, "CORRECT\n"); 
    } else { 
    fprintf(stderr, "BROKEN\n"); 
    } 

    return 0; 
}