2015-10-28 5 views
-9

Зачем нужен следующий код C 0.000000?Вывод кода указателя

#include <stdio.h> 

void foo(float *); 

int main() 
{ 
    int i = 10, *p = &i; 
    foo(&i); 
} 

void foo(float *p) 
{ 
    printf("%f\n", *p); 
} 

Пожалуйста, объясните свой ответ.

+0

Вы получили ваши типы перепутали ... – Matheus208

+3

Я голосую, чтобы закрыть этот вопрос не по теме, потому что «Plz объяснить свой ответ», - объясняет UB домашнее задание. –

ответ

3

Вы делаете printf() интерпретировать биты целого числа, как если бы они были битами поплавка. Это undefined behavior.

Какой результат вы ожидали?

+1

Я не знал, что вы все еще отвечаете на вопросы. Удивительно видеть, что вы все еще отвечаете. :) – Haris

+0

Почему не было никакого литья. Я ожидал 10.000000 – user2653926

+2

@ user2653926 Когда это произойдет? Невозможно, чтобы 'foo()' знал, что вы лгали. Однако вы должны получать предупреждения о компиляторе, поскольку вы вызываете 'foo()' с аргументом неправильного типа. – unwind

1

Прежде всего, когда ваш код выглядит так, как в вашем вопросе, линия *p = &i; ничего не делает.

Дальше - вы передаете указатель на свою переменную int функции, ожидающей float. Как @unwind, упомянутый в комментариях, нет никакого способа для foo() знать, что вы солгали. Typecasting - это отличная вещь, от которой вы, похоже, это считаете.

#include <stdio.h> 
void foo(float *); 
int main() 
{ 
    int i = 10; //try this and see it fails, 
       //then switch this line with float i = 10; and try again 
    foo(&i); 
} 
void foo(float *p) 
{ 
    printf("%f\n", *p); 
} 

EDIT> Если вы настаиваете на иметь где-то ... приведение типа

#include <stdio.h> 
void foo(float *); 
int main() 
{ 
    int i = 10; 
    float p = (float)i; 
    foo(&p); 
    return 0; 
} 
void foo(float *p) 
{ 
    printf("%f\n", *p); 
} 
1

Variadic functions в C и C++ принимают переменное число аргументов, в то время как они не знают, тип аргументов входа.

Функция printf, первый аргумент - это строка, которая, мы надеемся, указывает типы следующих аргументов на спецификаторы формата .

В вашем коде ваш спецификатор указывает, что следующий аргумент - это float (%f), но вы передали целое число. Поскольку вся эта проверка типов происходит во время выполнения, а компилятор ничего не знает об этом, автоматическое кастинг не производится.

Ваш код вызывает неопределенное поведение.

0

Попробуйте это:

#include <stdio.h> 
void foo(int *); 
int main() 
{ 
    int i = 10; 
    foo(&i); 
} 
void foo(int *p) 
{ 
    printf("%f\n",(float) *p); 
} 
Смежные вопросы