3.c/c++程序员面试宝典-变量
面试题46 什么是左值和右值
面试题47 什么是变量**
面试题48 变量有哪几种初始化方式*****
面试题49 变量默认初始化有什么规则***
面试题50 什么是变量的声明和定义*****
面试题51 c++中有哪几种作用域*****
面试题52 局部变量与嵌套的作用域****
面试题53 变量有哪几种存储类型**
面试题46 什么是左值和右值
分析:左值可以出现在赋值语句的左边或右边,也就是说左值可以当右值使用。右值只能出现在赋值的右边,不能出现在赋值语句的左边。左值表示程序中必须有一个特定的名字引用到这个值。右值表示程序中没有一个特定的名字引用到这个值。
变量是左值,因此可以出现在赋值语句的左边。数字字面值是右值,因此不能被赋值。实际上,左值是一个存储地址,也就是一块内存存储数据所要操作的地址。而右值是一个具体的数据或者数值,也就是该内存存储的数据内容。只有左值和右值都是单一变量的时候二者才可以相互交换位置,因为变量具有固定的内存地址。
左值和右值的示例代码如下:
int a =1; //变量a是一个左值
char str[]="hello,world"; //数组成员str[i]是左值
"hello,world"; //这个表达式是一个数据内容,它是一个右值
string("hello,world"); //这也是一个右值
注意:有些操作符,例如赋值,要求其中的一个操作数必须是左值,结果,可以使用左值的上下文比右值更广。左值出现的上下文决定了左值是如何使用的。
【答案】变量是左值,可以出现在赋值语句的左边,数字字面值是右值,不能被赋值。
面试题47 什么是变量**
分析:变量是在程序的运行过程中值可以发生改变的量。
变量是程序中数据的临时存放场所。在代码中可以使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性等各种数值。由于变量可以把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。好的变量名可以大大地提高程序的可读性和可维护性。变量可以保存程序运行时用户输入的数据(如使用一个函数在屏幕上显示一个对话框,然后把用户输入的文本保存到变量中)、特定运算的结果或者要在窗体上显示的一段数据等,简单来说,变量是用于跟踪几乎所有类型信息的一种简单方便的工具。
一个简单的示例代码如下:
int a = 5; //变量a
int b = 2; //变量b
a = a + 1; //a数值加1
result = a - b; //输出a和b的差值
上面代码简单地描述了两个变量a和b以及两者之间的简单操作。
【答案】变量是指在程序的运行过程中随时可以发生变化的量,变量是在电脑内存里可修改的、存在值的命名空间。
面试题48 变量有哪几种初始化方式*****
分析:变量定义指定了变量的类型和标识符,也可以为对象提供初始值。定义时指定了初始值的对象被称为已初始化的。
c++支持两种初始化变量的形式即复制初始化和直接初始化。复制初始化语法使用等号(=)给变量赋初始值,直接初始化则是把初始化值放在括号中,两种初始化示例代码如下:
int a(100); //直接初始化
int b = 200; //复制初始化
如果变量在定义的时候没有进行初始化,情况会是怎么样呢?编程者看下面一段示例代码。
int main()
{
int a;
double b,c;
getchar();
return 0;
}
运行结果如下。
a=1 b=3.239 c=5.4432
从以上结果看,除了a之外,另外的两个值都是杂乱无章的。实际上,在c、c++中,如果变量在定义的时候没有被初始化,它的值将是不确定的,这也是程序员在使用变量时需要考虑到的一点,不确定的值有可能导致程序出现错误。一般来说,编程者为了保证程序的稳定性,尽量做到将所有的变量都进行初始化。
变量的初始化一般不会再面试的时候出现直接考查的情况,但是在考查程序编写的时候,几乎是肯定会需要用到的。
【答案】变量初始化指创建变量并同时给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。其中,直接初始化的语法更加灵活而且执行的效率更高。
面试题49 变量默认初始化有什么规则***
分析:当定义没有初始化表达式的变量时,系统有时候会自动帮编程者初始化变量。这时,系统会提供什么样的值取决于变量的类型和变量定义的位置。
内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化为0,在函数体里定义的内置类型变量不进行自动初始化。除了用作 赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的。
类自身定义了该类型的对象可以怎样初始化。类通过定义一个或多个构造函数来控制类对象的初始化。如果定义某个类的变量时没有提供初始化,这个类也可以定义初始化时的操作。它是通过定义一个特殊的构造函数即默认构造函数来实现的。
【答案】系统有时候会自动帮编程者初始化未初始化的变量。使用未初始化的变量是常见的程序错误,但通常也是很难以发现的错误,有时候会导致编程者在程序运行时发生的问题原因上出现判断错误。所以建议每个内置类型的对象都要初始化。虽然这样并不是完全必须的,但是会让程序容易和安全。
面试题 50 什么是变量的声明和定义*****
分析:声明用于向程序表明变量的类型和名称。定义也是一种声明,当定义变量时编程者声明了它的类型和名称。也可以通过使用extern关键字声明变量名但不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern,示例代码如下:
extern int a; //声明但是未定义a
int b; //定义b
注意:extern声明不是定义,也不会分配存储空间,它只是说明变量定义在程序的其他地方,含有初始化的extern声明别当做是定义,程序中变量可以声明多次,但只能定义一次。
变量的定义用于为变量分配存储空间,还可以给变量初始化。在一个程序中,变量有且只有一个定义,定义变量的示例代码如下:
int a;
int b;
int c; //定义3个整型变量a,b,c
int d,e,f; //同时定义了3个整型变量
int g=10; //定义变量g并且初始化
在c++中,变量有且仅有一次定义,而且变量在使用之前必须声明或者定义。
【答案】c++程序通常由许多文件组成。为了让多个文件访问相同的变量,c++区分了声明和定义。定义和声明有相同的时候,但声明的主要目的是表面变量的类型和名称,而定义的主要目的是为变量分配存储空间。
面试题51 c++中有哪几种作用域*****
分析:在c++中,每个变量名都与唯一的实体(例如变量,函数和类型等)相关联。尽管有这样的要求,还是可以在程序中多次使用同一个变量名,只要它用在不同的区域中,且通过这些区域可以区分该变量名的不同意义。用来区分变量名的不同意义的区域统称为作用域。大多数作用域使用花括号{ }来划定界限的。
c++标识符作用域分为全局作用域和局部作用域。
先来一段示例代码。
#include
int main()
{
int sum=0; //定义变量sum
for(int i=1; i<=10;++i) //定义变量i
sum +=i;
std::cout<<"1到10相加的和为:"<
return 0;
}
在以上的代码中,变量sum具有局部作用域。变量i定义在for语句的作用域中,只能在for语句中使用,而不能用在main()函数的其他地方。它具有语句作用域,语句作用域也是一种局部作用域。
定义在所有函数外部的变量具有全局作用域,全局作用域的示例代码如下:
#include
void main()
{
int a=0,b=0; //定义全局变量a,b,并初始化
a++;
b++;
cout<
{
float a=0.1; //定义局部变量a
a++;
b++;
cout<
}
a++;
b++;
cout<
cin>>a;
}
由以上代码可以看出,不同作用域的变量可以使用相同的变量名,全局变量可以在程序中的任何地方访问。
【答案】作用域是程序的一段区域,作用域用于区别变量名的不同有效范围,分为全局作用域,局部作用域和语句作用域。一个变量名可以和不同作用域中的不同实体相关联。
面试题52 局部变量与嵌套的作用域****
分析:局部变量就是具有局部作用域的变量,它的作用范围不属于整个程序,在函数内定义一个与全局变量同名的局部变量是很不好的,很容易造成程序的混乱,局部变量最好使用不同的名字。
在c++中,作用域是可以嵌套的。例如,定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用等。
相同的变量名还可以在内部作用域中重新定义。重新定义后是一个新的变量。理解和变量名相关联的实体需要搞清楚定义变量名的作用域。不过为了让程序有更好的可读性,并且不容易出错,建议代码中尽量不用重名的变量。
【答案】局部变量就是具有局部作用域的变量。在c++中,作用域是可以嵌套的。
面试题53 变量有哪几种存储类型**
分析:存储类型是从变量的存在时间(即生存期)来划分变量。变量的存储类型可以分为静态存储方式和动态存储方式。对于动态存储变量,当程序运行到该变量处时才为其分配存储空间,当程序运行到该变量所在作用域的结束处时自动收回为其分配的存储空间,因此它的生存期为所在作用域。在程序开始执行时就为其分配存储空间,直到程序结束时,才收回变量的存储空间,这种变量称为静态存储变量,其生命周期为整个程序执行的过程。
在c++中,变量的存储类型有自动类型、寄存器类型、静态类型、外部类型等4种。
(1)自动类型变量(auto)
自动类型只能是局部类型的变量,属于动态存储类型。
(2)静态类型变量(static)
static,即在程序运行的过程中静态变量始终是占用一个存储空间。静态变量只能在他的作用范围内使用,使用局部静态变量是为了在下次调用该函数时,能使用上次调用后得到的该变量的值。
(3)寄存器类型变量(register)
属于动态存储类型,编译器不为寄存器类型的变量分配内存空间,而是直接使用cpu的寄存器。以便提供对这类变量的存取速度。主要用于控制循环次数等不需要长期保存值的变量。
(4)外部类型变量(extern)
外部类型变量必须是全局变量,在c++中,有两种情况需要使用外部类型变量。一种是在同一源程序文件中,当在全局的定义之前使用该变量时,在使用前要对该变量进行外部类型变量声明。另一种是当程序有多个文件组成时,若在一个源文件中要引用在另一个源文件中定义的全局变量,则在引用前必须对所引用的变量进行外部声明。
如果在某文件中定义的全局变量不想被其他文件所调用,则必须将该变量声明为静态全局变量,也就是说,静态全局变量只能供所在的文件使用。
【答案】在c++中,变量的存储类型分为自动类型、寄存器类型、静态类型和外部类型等4种。