众所周知,我们无法在C中更改或修改常量变量。但是当我对常量变量进行类型转换时,其值已更改。我的意思是,它不应该发生。
这是预期的行为吗?
EDIT:
main()
{
int const i=1;
printf("%d",(float)i);
}
输出为0
答案 0 :(得分:3)
是的,这是预期的。类型转换不会更改变量,它会将内存中的值重新解释为不同的类型。
答案 1 :(得分:3)
演员不会“施放变量”。
强制转换应用于表达式,即首先计算您的值,然后将其转换为另一种类型。
(此外,您的其他代码也是可以改进的。请查看main
允许的原型,并始终在\n
的末尾添加printf
。)
答案 2 :(得分:3)
printf("%f",i);
将i解释为浮点数。如果你查看内存,你会看到我没有改变,而是重新解释它所在的内存:
int const i=1;
0x0012FF60 01 00 00 00 //memory location of i
float k;
k=(float)i;
0x0012FF60 01 00 00 00 //i still the same
printf("%f",i);
答案 3 :(得分:0)
值不会改变,但你在prinf语句中做了误解
#include<stdio.h>
main()
{
int const i=1;
float k;
k=(float)i;
printf("in decimal %d\n",i);
printf("in float %f \n",(float)i);
printf("k is %f \n",k);
return 0;
}
看它的输出是
in decimal 1
in float 1.000000
k is 1.000000
请参阅http://codepad.org/A2FWkncK
你的错误
k=(float)i;
这个陈述不会改变i的值,但它会将i的值转换为float,然后分配给k
printf("%f",i);
这里你用%f打印int值,所以它会给你错误的值
答案 4 :(得分:0)
您的代码不会更改const
变量i
的值。它会将该值转换为float
,并将结果存储在k
中,但不会将i
保留为无。
您的printf()
调用具有未定义的行为,因为您已使用带有%f
参数的int
格式说明符(当需要double
时)。这显示为1.000000
的原因很可能是因为您的体系结构的调用约定将不同位置的浮点值传递给标量值,并且该浮点位置恰好仍包含k
的值事先转换。