![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
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分
望高手赐教!!! 展开
我们知道,
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分
望高手赐教!!! 展开
2个回答
展开全部
第一个问题:
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、编译器会为每个标识符分配空间,并且为每个标识符登记一个符号表记录,用于记录该标识符是什么类型,如果是变量,则初始值多少等信息
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分,你觉得如何?
![](https://ecmb.bdimg.com/kmarketingadslogo/fc48c2040562611dd976dfc267a3114a_60_60.jpg)
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询