C问题。我有2个简单的C问题,望高手赐教!回答满意额外加20~50分。具体在下面:

问题1:我们知道,inta;a=10;这条代码可以理解为,编译器首先定义一个整型变量,给予4个字节的空间,并命名为a,然后把10赋值给空间大小为4的整形变量a。请问:直接... 问题1:
我们知道,
int a;
a=10;
这条代码可以理解为,
编译器首先定义一个整型变量,给予4个字节的空间,并命名为a,
然后把10赋值给空间大小为4的整形变量a。

请问:直接写为 int a=10;编译器怎么执行编译?执行的顺序是什么?

-------------------------------切割线---------------------

问题2:
先看代码
#include<stdio.h>
int main
{float r,right;
r=2;
girt=2*3.14*r;
printf("girt=%f\n",girt);
return 0;
}
上面这个代码,编译器会出现"conversion from 'double' to 'float' "的警告
看到这条警告,根据编程的经验,我迅速把girt改成了double,警告消失了。

出于好奇,我又把double girt 改成long girt ,编译器又出现警告!只是警告内容我忘了。
然后我就在想,为什么girt为double型就没错,而long double型就出错?
同时,为什么一定改girt,而不用改r?
望高手赐教。

------------------------------

同时回答两问题并回答相对完善者额外加20分

望高手赐教!!!
展开
 我来答
shechangxin
2012-08-25 · 超过15用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:45万
展开全部
第一个问题:
1、编译器会为每个标识符分配空间,并且为每个标识符登记一个符号表记录,用于记录该标识符是什么类型,如果是变量,则初始值多少等信息
2、当编译器遇到 int i = 10 时,首先会在符号表中查找是否有 i ,如果有,则说明定义是重复了,出错,否则,则为其分配空间,如何分配呢,编译器会为程序指定一块用于局部变量的栈空间,该空间有一个起始地址,每当分配一个局部量时,编译器就更新该地址,并将原地址分配给该变量,更新的方式是 起始地址 - 局部量占用空间,新地址将可以分配给新变量。编译器分配给 i 地址后,生成一条指令,用于将 10 存入分配给 i 的地址空间,当然不同编译器可能有些细节区别,这样就分配了 i 并赋值 10 了。

第二个问题:
在你的代码中有一个 3.14,系统将其作为 double,所以你的整个表达式得到的将是 double,double类型的值赋给float当然精度减少,要发出警告。
同样,如改为long,则将double存入long也是不行的,也会警告,警告可能不一样,但原理是一样的。
至于为何改girt是因为你的赋值 左值 是girt,所以必须确保 girt 能存储计算的表达式结果而不出现精度问题。而 右值 的 r 是不需处理的,系统会自动转为 double类型。

第二个问题可以查找C的类型转换,其实C的类型转换标准C与非标准C还不一样,得上网查查。

深信这样解释够详细了
追问
你讲的真详细!!!
谢谢!
1、能否告知你QQ,想加你!
2、追加10分,你觉得如何?
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
kenlee_gz
2012-08-25 · TA获得超过494个赞
知道小有建树答主
回答量:457
采纳率:33%
帮助的人:354万
展开全部
因系统把3.14默认为double类型,所以整个2*3.14*r运算返回double类型,double类型结果被赋给float类型的变量,类型降级了,所以警告。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式