Я тестировал кастинг типов в C++ сегодня после просмотра прошлой викторины и не мог на всю жизнь понять, почему значение "x" изменяется от 9 до 4.5000 в следующем коде.
int main(){
int x = 9, y = 2;
float z;
z = (float)x/(float)y;
printf("\n%f", z);
printf("\n%f", x);
printf("\n%d", x);
}
Выходы
4.5000
4.5000
9
Буду признателен за любую помощь!
Функция printf
ожидает, что float
будет в стеке (из-за %f
), и вы предоставили только int
.
В этом случае вам нужно указать x
в float
:
printf("\n%f", (float)x);
double
(к которому в этом случае автоматически float
аргумент float
).
В printf("\n%f", x)
с int x
вы не бросаете x
в float
- вы принимаете его как float. Это похоже на то, чтобы вручить пожарнику палочку с маслом и сказать ему, что это огнетушитель, - не будет работать правильно.
Чтобы выполнить бросок, вам нужно либо присвоить значение переменной, совместимой с литой:
float floatX = x;
printf("\n%f", floatX);
или использовать оператор трансляции:
printf("\n%f", (float)x);
va_arg(args, double)
в printf
приводит аргументы к двойному значению? Или же???
Это не сокращение вашего X пополам. посмотрите на код ниже, он все еще печатает 4.5
#include <stdio.h>
int main(){
int x = 9, y = 2;
float z;
z = (float)x/(float)y;
x = 15;
printf("\n%f", z);
printf("\n%f", x);
printf("\n%d", x);
}
это печатает:
4.500000
4.500000
15
Может быть, это должно быть сделано внутренне с тем, как float и ints хранятся в стеке. Его fishy, потому что его первое значение float, которое хранится. Если я изменю код на это:
#include <stdio.h>
using namespace std;
int main(){
int x = 11, y = 2;
float z;
z = (float)x/(float)y;
x = 15;
printf("\n%f", z);
printf("\n%f", x);
printf("\n%d", x);
}
выход
5.500000
5.500000
15
Если вы не печатаете переменную z
, тогда выход будет
0.000000
15
Возможно, это связано с порядком печати.
printf
без сбоев. UB.
printf
тип переменной, который не соответствует формату. Вы даетеprintf
int
, но обманываете его, говоря, что это типfloat
.-Wformat
(который включен в-Wall
).