A. C语言中已经声明或定义的变量如果在代码中没有使用到,编译器会怎样处理
就一直在那里放着。如果是全局变量,编译器连提示都没有;若是局部变量编译器在编译时会提醒说某某局部变量没有使用;若你不理会,在代码修改前就不会再提醒了。这些变量未使用,却一直占用着内存空间,但不影响代码的正确性……
B. 问一下各位,c语言编译器是如何处理变量名的呢
编译器编译到int a;时就在内存中开辟一个两字节的内存空间,并且命名为a
C. C 编译器对数组是如何处理的
我记得是在栈区连续分配数组大小的内存
D. 编译器的逻辑阶段可以怎样分组
编译器的逻辑阶段通常可以分为以下几个部分:
词法分析(Lexical Analysis):将源代码转换为单词序列,也称为词法单元或记号。词法分析器将源代码字符流扫描,边扫描边识别记号,然后将这些记号作为输出传递给下一个阶段。识别出的词法单元通常是关键字、标识符、运算符、界符、常量等。
语法分析(Syntax Analysis):将单词序列转换为语法分析树,也称为语法树。语法分析器通过词法分析器输出的记号序列构建出语法树,检查代码是否符合语法规则。如果发现不符合语法规则的语句,会生成一个错误消息。
语义分析(Semantic Analysis):对语法树进行语义检查。语义分析器会检查语法树中的语法单元是否符合语义规则,例如变量是否已声明,数据类型是否匹配,函数参数是否正确等。如果发现不符合语义规则的语句,会生成一个错误消息。
中间代码生成(Intermediate Code Generation):将语法树转换为中间代码。中间代码是一种与源代码无关的代码形式,通常使用一种类似于汇编语言的中间表示形式如伍蠢。
代码优化(Code Optimization):对中间代码进行优化,以提高程序的性能和效率。代码优化器会应用一些优化技术,例如常量折叠、死代码消除、循环展开等。
目标代码生成(Code Generation):将中间代码橘配转换为机器码或目标代码。代码生成器会将中间代码转换为目标机器的机器码或汇编代码,以便可执行程序的生成。
符号表管理(Symbol Table Management):维护变量、函数等符号的信息。符号表管理器会记录符号的类型、作用域、存储位置等信息,并提供符号的查找、插入、删除等操作。
以上是编译器的典型逻辑阶段,不同的编译器可能会渣陪有所不同,但通常都会包含以上阶段的一部分或全部。
E. 我们经常看到书上面说的 某某变量的内存单元是编译器在编译时候分配的 是什么意思
所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以
明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不
必在程序运行期间用额外的代码来产生这些变量。
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用
域,生存期等等),对应的只是一块内存(只有首址和大小),
所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了;
写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)
内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实
现申请和释 放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。
最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行。
F. 编译器在编译的时候做了什么给申明的变量分配内存
第一是将java文件编译成字节码文件
就是class文件
给jvm执行
第二就是分配常量池
就是给你代码里面的变量和方法分配空间
G. 编译器编译高级语言为低级语言的时候,给全局变量或静态变量是如何分配内存的
对于C和C++的编译器,全局变量和静态变量都是在专门的数据区保存的,更具体一点,一般是在.data和.bss段保存的,具体在哪个段,编译器会根据代码中是否对这些变量进行了初始化来决定,如果初始化过,并且初始化的值不为0,那么这个这个变量一般就会被放在编译结果的.data段中,否则就是放在.bss段中。
.data段中就保存变量的符号,还保存变量的初始化值,而在.bss段中,只保存变量的符号,而不保存值,这是因为这部分的变量都将被初始化为0,这也是为什么static声明的变量即使没有初始化也会是0的原因。
这些段都会在程序被执行的时候由操作系统(或链接器)加载到指定的内存中,便完成相应的初始化。
H. 编译器对作为局部变量的数组是怎么管理的放在堆栈中
C语言的堆跟栈是有区别的,请大家不要混淆。
局部变量和函数调用时的实参是放在栈里。所以有大家常说函数调用时的入栈,出桟这个说话。
动态申请的内存放在堆里的。
全局变量和静态变量是放在另外的全局内存区。
I. c语言怎样销毁变量
你好,变量的内存分配和销毁是由编译器自动管理的,全局变量在程序结束时销毁,局部变量在花括号的最后自动销毁,不能手动销毁哦
要实现你说的这个功能,不必销毁ch变量,可以采用楼上说的强制转换,也可以再申请一个变裤察量把ch值赋给int(推荐),也可以建立一个union类型,声明一个union{int i, char ch}newType; 这样就能随时变化类型,但是结构较复伍悉杂,胡橘茄不推荐
希望能帮到你哦
J. 编译器在编译的时候做了什么给申明的变量分配内存
第一是将java文件编译成字节码文件 就是class文件 给jvm执行
第二就是分配常量池 就是给你代码里面的变量和方法分配空间