Зачем нужен следующий код 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);
}
Пожалуйста, объясните свой ответ.
Зачем нужен следующий код 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);
}
Пожалуйста, объясните свой ответ.
Вы делаете printf()
интерпретировать биты целого числа, как если бы они были битами поплавка. Это undefined behavior.
Какой результат вы ожидали?
Я не знал, что вы все еще отвечаете на вопросы. Удивительно видеть, что вы все еще отвечаете. :) – Haris
Почему не было никакого литья. Я ожидал 10.000000 – user2653926
@ user2653926 Когда это произойдет? Невозможно, чтобы 'foo()' знал, что вы лгали. Однако вы должны получать предупреждения о компиляторе, поскольку вы вызываете 'foo()' с аргументом неправильного типа. – unwind
Прежде всего, когда ваш код выглядит так, как в вашем вопросе, линия *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);
}
Variadic functions в C и C++ принимают переменное число аргументов, в то время как они не знают, тип аргументов входа.
Функция printf
, первый аргумент - это строка, которая, мы надеемся, указывает типы следующих аргументов на спецификаторы формата .
В вашем коде ваш спецификатор указывает, что следующий аргумент - это float (%f
), но вы передали целое число. Поскольку вся эта проверка типов происходит во время выполнения, а компилятор ничего не знает об этом, автоматическое кастинг не производится.
Ваш код вызывает неопределенное поведение.
Попробуйте это:
#include <stdio.h>
void foo(int *);
int main()
{
int i = 10;
foo(&i);
}
void foo(int *p)
{
printf("%f\n",(float) *p);
}
Вы получили ваши типы перепутали ... – Matheus208
Я голосую, чтобы закрыть этот вопрос не по теме, потому что «Plz объяснить свой ответ», - объясняет UB домашнее задание. –