C语言 double c = 123; 为什么可以是123这个整数,而不是小数
意思是123.0吗?
追答意思是123.0吗?——那倒不是。C规定不写小数点的数字是int型,有小数点的数字是double型,就是说123和123.0虽然值相等但不是同一个类型。而且又规定,较“短”类型赋值给较“长”类型时自动将短类型临时提升到长类型再赋值,所以double c=123;的意思是“先把int型123自动变成double型的123.0再赋给c。
追问是C语言隐式强制类型转换吗?
追答是C语言隐式强制类型转换吗?——是。
追问先把int型123自动变成double型的123.0再赋给c,你能把他的代码写出来吗?
追答它有什么代码?double x;x=123;就可以了。编译器在解析;x=123;时不再将123的32位补码存入x变量的地址空间,而是先将123变成64位的“符号位(1位)+阶码(11位)+尾数(52位)”二进制序列存储到x变量地址空间——所有自动强制类型转换对程序员都是透明的,没有转换语句。
追问int a, b;
float c = 12.3;
a = c;
b = (int)c;
结果是a与b的值都是12.其中,代码a=c是隐式转换,就是编译器发现类型不匹配自动给转的.
而b = (int)c就是强制类型转换
你看人家这个都有代码
这叫“转换代码”?那我写的double x;x=123;不是?这都是普通C代码,哪里是转换代码?a = c;是要把一个32位二进制补码“转换”成一个“符号位(1位)+阶码(8位)+尾数(23位)”的32位二进制浮点表达,代码在哪里?
追问代码怎么理解,int a.b;是一个语句吧?那代码是怎么样的?
追答这没有严格定义。但共识是“有一个完整格式和完整功能的语句集合”才可能是代码,否则只能叫语句,或代码行。
追问完整功能的语句集合,那不是叫程序了吗?
追答原则上代码和程序没有多大区别,而且谁包含谁也说不清。比如,一个很复杂的C程序,可能有好几个文件组成,有的文件可能就一个现成的程序,这几个文件的组合却可被称为“源代码”。这似乎代码包含着程序。但即便是简单的求一组数的最大值最小值的程序,其中若求最大值最小值的功能是用函数实现的,那个这函数板块也可叫“功能代码”。这又叫人觉得程序包含着代码。其实代码与程序的主要区别在于,代码一般指用C语句书写出来的那些文件,叫源代码,源程序都是可以的;而编译链接后形成可执行文件就叫程序了,再叫代码似乎就牵强不妥了……你说呢?
追问你看我这样理解行不,一个语句就是一个代码,所有语句就是一个大代码,