//最初的情形
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1/a;
printf("%-15d%-15d%-15f%-15f",1/a,b,1/a,b);
}
输出结果:0 0 0.000000 0.000000
//第二次的情况
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1/a;
printf("%-15d%-15d%-15f%-15f",1.0/a,b,1.0/a,b);
}
输出结果:1431655765 1070945621 0.000000 0.333333
请问前两个数据时怎么来的,1.0/a发生了强制转换,但b为什么会改变?另外对于输出的第三个数据,C语言在已经发生强制转换的情况下为什么不能用浮点型的格式符输出?
//第三次修改
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1.0/a;
printf("%-15d%-15d%-15f%-15f",1/a,b,1/a,b);
}
输出结果:0 1431655765 0.000000 0.333333
第二个数据怎么来的?
//第四次修改
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1.0/a;
printf("%-15d%-15d%-15f%-15f",1.0/a,b,1.0/a,b);
}
输出结果:1431655765 1070945621 0.333333 0.333333
这次为什么第三个数据可以正常输出了?第一、二个数据怎么来的?
你的意思是输出时虽然可以以不同格式输出,但并不是进行了强制转换,仅仅是按照不同数据类型的字节数来从栈中取,对吧?
我之前是受97可以用%c输出'a'误导,以为这是强制转换的一种形式,这样分析的话
printf("%c\n%c",97); //之所以会输出的一个'a'和一个空,正是由于97保存为4字节long,取出了其中的一个字节'a' 和一个字节空输出,对吧?
如果我想弄清它每个二进制位进栈和出栈的顺序,这是属于编译原理的内容吗?
是的,我在windows上测试的,char是会转成int类型的,所以也是取4个字节;故在不定个数参数的函数里面,对参数的解析都要做相应转换,基本类型只能取4个字节,8个字节等,也是为了对齐吧;如果没有这些所谓的类型提升,会导致很多bug出现的对于不定个数的参数函数来说;自己可以测试一下;
函数进栈顺序是先是函数参数,然后是返回地址,然后是代码段;栈是高到低存放;