2016-04-21 1 views
-5

Вот код, который я написалПочему я не получаю ожидаемый результат при прохождении полукокса к функции в C

#include<stdio.h> 

main() 
{ 
    float a = 15.5 ; 
    char ch = 'd' ; 
    printit (a, ch); 
} 
printit (a, ch) 
{ 
    printf ("\n%f %c ", a, ch) ; 
} 

И выход:

15,500000 ─

Здесь я ожидаю, что символ d будет напечатан вместо -.

+3

1) Формат кода правильно. 2) Вы должны получить предупреждение уже для отсутствующего объявления (или прототипа) 'printit'. Также это доисторический C (иначе K & R-C). ** Никогда не используйте это. Он устарел с ок. 27 лет. И код вызывает неопределенное поведение. – Olaf

+0

** Никогда ** не писать код C таким образом. Помимо проблемы неопределенного поведения, этот код действительно трудно понять. – jboockmann

+0

у вас не было прототипа/объявления 'printit' перед его использованием. И помните о своем отступе –

ответ

4

TL; DR, ваш код вызывает undefined behavior.

Вы используете опасный (к счастью, теперь нестандартную Ref) способ получения типы переменных, то есть типа по умолчанию int.

Как ваши переменные отсутствуют определения типов данных, они по умолчанию равны int. Таким образом, внутри printtit(), a и ch имеют тип int.

Теперь, пройдя a в качестве аргумента для %f, вы вызываете UB уже. Программу (и ее выход) нельзя ни доверять, ни оправдывать.

Примечание: Включите предупреждения компилятора и обратите внимание на них!


Ссылка: Цитируя C11 (доступен в C99 также),

Основные изменения во втором издании включены:

. , , ,

- удалить неявный INT

0

Хотя вопрос был решен, я хотел бы добавить правильно переписан версию кода:

#include<stdio.h> 

void printit (float, char); // function declaration 

int main(void) 
{ 
    float a = 15.5 ; 
    char ch = 'd' ; 
    printit (a, ch); 
    return (0); 
} 
void printit (float a, char ch) 
{ 
    printf("\n%f %c ", a, ch) ; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^