2017-01-24 12 views
0
#include<stdio.h> 

int main() 
{ 
    short a, b, c; 
    printf("Enter the values of a, b and c: "); 
    scanf(" %d %d %d ", &a, &b, &c); 
    if(a<b && a<c) 
     printf("a is smaller"); 
    else if(b<a && b<c) 
     printf("b is smaller"); 
    else 
     printf("c is smaller"); 
    return 0; 
} 

Für den Eingang a=10, b=12, c=13, gibt es den Ausgang "c ist kleiner"?Kurz funktioniert nicht, aber Int funktioniert?

Und wenn ich die short durch int ersetze gibt es korrekte Ausgabe. Ich habe auch die %h, %i versucht, aber es gibt die gleichen aus.

Was läuft falsch?

+13

Es ist UB zu vermeiden, werden Sie vorbei 'short' statt' int', dass der Typ für '% erwartet d 'format specifier – LPs

+0

Undefiniertes Verhalten ist nicht definiert. –

+2

Gehen Sie davon aus, dass 'short' und' int' die gleiche Breite haben? –

Antwort

2

Verwendung:

scanf(" %hi %hi %hi ", &a , &b , &c); 

%d für int ist, wo als %hi für short Datentypen

+1

Und Sie sollten auch klarstellen, warum Sie ** i ** zum Formatbezeichner hinzufügen. Vielleicht will OP das nicht. – LPs

+1

Beachten Sie, dass "% hi" '033' als 27 und' 0x1B' auch als 27 akzeptiert. Die Verwendung von '% hd' wäre konsistent mit dem ursprünglichen Code, der'% d' verwendet. –

+1

Eine genauere Aussage wäre "'% d' ist für 'int', während'% hd' für 'kurze' Datentypen steht". Tatsächlich hat die Unterscheidung zwischen "% d" und "% i" nichts mit "int" gegen "short" zu tun. Es ist der 'h' Modifikator, der für' short' wichtig ist. –

0

Der Code unten verläuft short *, noch scanf("%d... erwartet eine int *. Die Verwendung der falschen Spezifizierer/Typ-Übereinstimmung führt zu undefiniertem Verhalten.

Ihr Compiler sollte vor diesem Problem gewarnt haben. @Olaf

short a; 
scanf("%d", &a); // wrong type 

Statt einen h Modifikator eine short *

scanf("%hd", &a); 

, um anzuzeigen, wenn Sie einen alten Compiler verwenden, welche die h Modifikator fehlt, als int lesen und dann zuweisen.

int t; 
scanf("%d", &t); 
a = t; 

BTW: am besten den hinteren Raum in " %d %d %d "

// Avoid last space 
// scanf(" %d %d %d ", &a, &b, &c); 

scanf("%hd %hd %hd", &a, &b, &c); 
// or the following which does the same 
scanf("%hd%hd%hd", &a, &b, &c); 
Verwandte Themen