1. 程序语言编译器是怎样被计算机识别的
源代码是由字符组成的吧?
明白这一点就好办了
编译器首先将你写的代码读入内存,然后寻找代码中的关键字、标识符等信息,建立一个所谓的符号表,根据这个符号表对你的源代码进行检查,检查的依据正是该语言的语法和句法规则。比如是否有变量重复定义错误、是否有类型不兼容错误,是否有遗漏语句分隔符错误等等。这些都是比较简单的,例如根据语言的关键字表可以检查是否有非法的关键字(语句分隔符之后的下一个有效字符一定是一个关键字或已定义的标识符,因此很容易识别并挑出其中的关键字进行检查),其它检查也是类似的。
检查没有问题后,编译器开始链接和映射操作(该过程在检查阶段也有使用),将你的源程序翻译成汇编程序或其它中间程序。这一步是最复杂的,因为句法和语法比较简单,但整个程序的逻辑却复杂的多,而且编译器还要负责在不改变代码原意的前提下将代码尽可能地进行优化。
最后就是将生成的汇编代码翻译为机器语言,这一步是最简单的,因为汇编只是将机器语言简单符号化而已,现在的编译理论已经能够确保将汇编代码准确地翻译为机器码了。
以上。
2. C语言的关键字是什么,为什么叫关键字,怎么来的
1.关键字就是C语言编译器识别专用的字符串。
2.因为这些是C里规定死并且比较重要的字符串(key words)所以叫关键字的,好像你名字一样。
3.开发C语言的人定下来的。
补充一下,下次千万别问这种问题啊,就好像你问别人为什么要叫李四一样。
3. 简述C语言中标识符和关键字的概念与区别
标识符是在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线()组成的字符串,并且其第一个字符必须是字母或下划线。
在使用标识符时还必须注意以下几点:
(1)标准C不限制标识符的长度,但它受各种版本的C 语言编译系统限制,同时也受到具体机器的限制。例如在某版本C 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如BOOK和book 是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,作到“顾名思义”。
关键字你看一看这一个
4. 操作系统和编译器是怎么识别全局变量和局部
操作系统,只管调度进程,线程编译器根据编程语言的定义,确定变量的作用于,存储类型,生命周期!
定义在函数外部的变量,只有文件静态变量,和外部变量
外部变量,是实实在在的全局变量,不论作用域还是生命周期。
静态变量是局部作用域的,生命周期为,程序的生命周期的变量。
自动变量和函数参数,是局部作用域的生命周期为函数结束的局部变量。
寄存器变量,用register定义,是局部变量;
函数内部的静态变量,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。
静态变量,编译器,可以通过static关键字知道。
自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。
2)函数参数,只能是自动变量,不过也可能定义在寄存器中。
这和调用约定有关,因此不可以用register定义。
C语言没有全局变量这种数据类型。
只有4种存储类型,和变量的作用域与生命周期的概念。
C++同样没有全局变量这种数据类型。
有另外的两种作用域
1)namespace作用域。
2)类(类型)作用域。
C只有全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。
其中内层,对外部作用域,具有完全的遮蔽作用。
C++可以通过作用域限定符,区分不同作用域(类,名空间)的名字。
类作用域,可以通过访问权限,限制外部的访问权。
函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。
也不会和外部有命名冲突,只会遮蔽外部的名字。
类作用于,和名空间由于访问方式不同,命名冲突和遮蔽有些特殊。
函数和全局域,基本不会和类作用域有命名冲突,除非类方法内部。
命名空间,可以避免命名冲突。
类继承体系中,则有遮蔽现象。
还有访问权限问题。
实际上,全局变量,有两个概念可以判定
1)作用域(空间)===>由定义和声明位置,和定义和声明使用的关键字决定。
2)生命周期(时间)===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。
函数参数,和函数局部非静态变量,是局部变量
函数参数的传递,是跨函数的(实参,变成形参);
函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部,
其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。
全局变量,不是C,C++的概念。
而是,使用编程语言的程序员的概念。
所以,全局变量和C,C++的存储类型,作用域,生命周期等,不是一一对应的概念。
所以,可以有不同的理解。
所以这个概念是很模糊的,不清晰的。
比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。
5. C语言关键字是什么
所谓关键字就是已被 C语言编辑工具本身使用, 不能作其它用途使用的字。
auto :声明自动变量 一般不使用
double :声明双精度变量或函数
int: 声明整型变量或函数
struct:声明结构体变量或函数
break:跳出当前循环
else :条件语句否定分支(与 if 连用)
long :声明长整型变量或函数
switch :用于开关语句
case:开关语句分支
enum :声明枚举类型
register:声明积存器变量
typedef:用以给数据类型取别名(当然还有其他作用)
char :声明字符型变量或函数
extern:声明变量是在其他文件正声明(也可以看做是引用变量)
return :子程序返回语句(可以带参数,也看不带参数)
union:声明联合数据类型
const :声明只读变量
float:声明浮点型变量或函数
short :声明短整型变量或函数
unsigned:声明无符号类型变量或函数
continue:结束当前循环,开始下一轮循环
for:一种循环语句(可意会不可言传)
signed:生命有符号类型变量或函数
void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
default:开关语句中的“其他”分支
goto:无条件跳转语句
sizeof:计算数据类型长度
volatile:说明变量在程序执行中可被隐含地改变
do :循环语句的循环体
while :循环语句的循环条件
static :声明静态变量
if:条件语句
6. 编译器怎么区分标识符和字符
首先要清楚标识符和字符的定义
标识符是程序员自己规定的具有特定含义的单词,比如类名称,属性名称,变量名等。
举例子就是
class
string
字符是指计算机中使用的字母、数字、字和符号
举例子就是
1,2,3,abc
然后要强调,编译器是无法区分标识符和字符的,只有人事先为其规定好规则的情况下,编译器才会按照标识符的方式去读取。打个比方,我规定了class为类标识符,那当我程序里
出现了class
test时,编译器就会认为test是类而不是字符。不知道能不能理解,不过是个好问题
7. 1.C编译程序如何准确识别整型short、int、long和实型float、double、long
编译器根据 short int 这些类型说明符来识别变量是什么,你写的关键字就是让编译器识别数据类型用的。。。准确识别识别是因为变量声明的原因,也是为什么C必须进行变量类型声明。。。
如果呢是只自己如何快速识别变量类型,有一个很特别的命名规则,可以让你一眼看出类型,
比如int型 你可以用 int iNumber; 这样的命名方法,在前面+i来方便你认为他是个整型,不过很多编辑器在你输入变量后鼠标悬停会有类型提示,有点多此一举。。。
你问的问题我没有搞清楚你要问什么,描述不是很清楚。。。
8. 关键字和一般标识符的区别
一、主体不同
1、关键字:属于保留字,是整个语言范围内预先保留的标识符。
2、一般标识符:用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。
二、特点不同
1、关键字:不能声明与关键字同名的标识符。
2、一般标识符:由字母和数字以及其它字符构成。
三、规则不同
1、关键字:经过预处理后,关键字从预处理记号(preprocessing-token)中区别出来,剩下的标识符作为记号(token),用于声明对象、函数、类型、命名空间等。
2、一般标识符:长度是由机器上的编译系统决定的,一般的限制为8字符。
9. 请问C语言中的字符哪些可以做为变量,哪些不可以做为变量
1,变量名必须由字母、数字、下划线组成2,首字符不能是数字3,不能太长,具体长度限制由编译器设定,太长会被编译器截取前面的,如果定义的两个变量,在编译器可识别的范围相同,而后面的不同,编译器将视为同一个变量。4,不能是C的保留字,如if,for,main,break不能作为变量名