2017-01-24 3 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; 
} 

Для входа a=10, b=12, c=13, он дает выход "С меньше"?Short не работает, но int делает?

И когда я заменяю short на int, он дает правильный результат. Я также пробовал %h, %i, но он выводит то же самое.

Что случилось?

+13

Это UB, вы передаете 'short' вместо' int', то есть тип ожидается '% d' – LPs

+0

Неопределенное поведение не определено. –

+2

Вы считаете, что 'short' и' int' имеют одинаковую ширину? –

ответ

2

Использование:

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

%d для int, где в качестве %hi для short типов данных

+1

И вы также должны уточнить, почему вы добавляете ** i ** в спецификатор формата. Возможно, OP этого не хочет. – LPs

+1

Обратите внимание, что '% hi' будет принимать' 033' как 27 и '0x1B' также как 27. Использование'% hd' будет соответствовать исходному коду, использующему '% d'. –

+1

Более точным утверждением будет «'% d' для 'int', тогда как'% hd' для «коротких» типов данных ». Фактически, различие между '% d' и'% i' не имеет ничего общего с 'int' против' short'. Это модификатор 'h', который имеет значение для' short'. –

0

Ниже код проходит short *, но scanf("%d... ожидает int *. Использование неправильных результатов поиска спецификатора/типа в неопределенное поведение.

Ваш компилятор должен был предупредить об этой проблеме. @Olaf

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

Вместо использовать h модификатор для обозначения short *

scanf("%hd", &a); 

Если вы используете старый компилятор, в котором отсутствует модификатор h, считанный как int, а затем назначить.

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

КСТАТИ: лучше избегать косую пространства в " %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); 
Смежные вопросы