2.c/c++程序员面试宝典-操作符
面试题41 操作符有哪些分类***
面试题42 操作符优先级对运算结果有什么影响****
面试题43 逻辑操作与其他操作的关系**
面试题 44 自增自减前操作与后操作的区别****
面试题45 指针自增自减有什么不同***
面试题41 操作符有哪些分类***
分析:操作符又被称为运算符,表达式由一个或多个操作数通过操作符组成,操作符对不同的数据进行操作,操作符表示程序中执行语句的性质。相同的操作符对不同数据类型的运算和运算结果都可能会出现不同。操作数执行什么操作,以及操作结果的类型是由操作数类型来决定的。
c、c++提供了丰富的操作符以帮编程者完成执行语句,另外还提供了操作符重载功能,用以允许程序员自定义用于类类型是操作符的含义。c++标准库就是使用了这种功能定义于库类型的操作符。每个表达式都会产生一个结果,如果表达式没有任何操作符,则表达式产生的结果就是操作数本身。
按照所操作数的不同,操作符分为一元运算符(作用于一个操作数)和二元运算符(作用于两个操作数),此外还有一个三元操作数(条件操作符)。有的操作符既可以是一元操作符又可以是二元操作符。
按照功能的不同,操作符分为算术操作符、关系操作符、逻辑操作符、位置操作符、赋值操作符、自增和自减操作符、箭头操作符、条件操作符、sizeof操作符、逗号操作符等类型。
【答案】表达式是由操作符、操作数字和标点符号组成的序列,目的是为了说明一个运算过程,操作符说明了表达式的主要目的,并且计算返回结果。
按照功能区分操作符有算术操作符、关系操作符、逻辑操作符、位置操作符、赋值操作符、自增和自减操作符、箭头操作符、条件操作符、sizeof操作符、逗号操作符等10种类型。
按照操作数区分操作符分为一元操作符、二元操作符和三元操作符等3类。
面试题42 操作符优先级对运算结果有什么影响****
分析:操作符优先级决定了表达式运算的次序、操作符优先级越高,则运算次序越靠前。
在所有的优先级中,有3个是从右至左结合的,分别是单目运算符、条件运算符、赋值运算符。其他的操作符都是从左至右结合的。
操作优先级使用的示例代码如下:
int x;
x= - 3 * 4 % -6 / 5; // x = (((-3) * 4) % (-6) ) / 5;
上面代码中,“*”、“%”、和“/”的优先级是一样的,结合顺序是自左向右。
int x = 2, y = 1, z = 0;
z + = - x ++ + ++ y; //z + = (- (x++) ) + (++y);
上面代码中,“++”和“--”的优先级要高于负号(“++”和“--”只对左值有效)。
int x = 1, y = 1, z =1;
z += x < y ? x ++ : y ++; //z += (x < y ? (x ++) : (y ++));
上面代码中“+=”的优先级仅高于“,”。
int x = 3, y=4, z =4;
(z >= y >= x) ? 1 : 0; //((z >= y) >=x) ? 1:0;
上面代码中“>=”的结合顺序是自左向右。
int x =1, y=1, z=1;
++x || ++ y && ++z; // ++ x || (++y && ++x);
上面代码中,++x始终为真,由于||的短路,后面的表达式将不被计算,所以只有x变成了2.
通过操作符优先级的不同运用,相同的操作数和操作符组合成的表达式可以得到不同的计算结果,c++的操作符优先级一共有16个等级,如下表:
【答案】优先级决定了表达式的运算顺序,不同优先级的运算符的不同使用会影响表达式的运算结果。
面试题43 逻辑操作与其他操作的关系**
分析:逻辑操作分为逻辑或、逻辑与和逻辑非3种,使用算术或指针类型的操作数,逻辑操作将其操作数视为条件表达式,它们都只返回true和false两种值。
逻辑或(||)和逻辑与(&&)操作是二元运算符,它们首先对操作数求值,若结果为0,则条件为假(false),否则为真(true)。逻辑与操作符需要两个操作数都为true,计算结果才为true。而逻辑或操作符只需要两个操作数之一为true,它的结果就为true。
逻辑与和逻辑或操作符在使用时,总是先计算它的左操作数,然后再计算右操作数。只有在左操作数的值无法确定该逻辑表达式的结果时,才会去求解右操作数。这种求值方式也被称为“短路求值”。
逻辑非操作是一元运算符,逻辑非操作符(!)将其操作数视为条件表达式,产生与其操作数值相反的条件值。如果其操作数为非零值,则做!操作后的结果为false。
一个逻辑或和逻辑与运算符使用的示例代码如下:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int age=0; //定义年龄变量
int income=0; //定义收入变量
int balance=0; //定义存款变量
cout<<endl<<"please enter your age:";
cin>>age;
cout<<"please enter your annual income:";
cin>>income;
cout<<"what is your current account balance:";
cin>>balance;
cout<<endl;
if(age>=21 && (income>25000 || balance>100 000))//判定贷款的条件
{
int loan=0;
if(2*income<balance/2)
{loan=2*income;}
else
{loan=balance/2;}
cout<<"you can borrow up to";
<<loan
<<endl;
}
else
{cout<<"sorry, you can`t borrow money now."
<<endl;}
return 0;
}
上面是一个简单的贷款程序,根据输入的年龄和收入或存款的情况来判定客户是否可以贷款,如果可以,则输出最大可以贷款的额度。其中,年龄是必须满足大于等于21岁的,而收入大于25000和存款大于100 000只需要满足一条即可,在这里使用了逻辑或和逻辑与运算符来制作判断条件。
【答案】逻辑操作只返回true和false这两种值,它们可以用来做判断条件,逻辑操作符不会改变被操作数的值。
面试题 44 自增自减前操作与后操作的区别****
分析:在c、c++中,自增(++)和自减(--)操作符为数据对象加1或减1操作提供了一种方便简洁的实现方式。它们都有前置和后置两种使用形式。自增操作符使得操作数的值加1,而自减操作符使得操作数的值减1.要替代以下代码:
int a;
a=a+1;
可以使用
++a; //前自增
或
a++; //后自增
前自增操作使其操作数加1,操作结果是修改后的值。同样,前自减操作使其操作数的值减1.这两种操作符的后置形式同样对其操作数执行加1(或减1)的操作,但后置形式再操作后表达式的结果是操作数原来的、未修改的值。也就是说,前自增自减操作返回左值,也就是对象本身,而后自增自减操作返回的是右值。这二者的示例代码如下:
int i=0, j;
j = ++i; //前自增操作,结果:j=1, i=1;
j = i++; //后自增操作,结果:j=1, i=2;
【答案】前自增自减操作的优先级大于赋值运算符(=),而后自增自减操作的优先级小于赋值运算符,后自增自减操作后表达式的值不会发生改变。
面试题45 指针自增自减有什么不同***
分析:指针的自增和自减是将指针的所指地址加1或者减1的操作,也有前置和后置的两种使用形式。
下面先来看一个指针自增的示例代码:
main()
{
char str[]="chinese people"; //定义一个数组
char *p=&str[0]; //定义指向数组第一个元素的指针
char *tem=&str[1]; //定义指向数组第二个元素的指针
printf("p=%p\n",p);
printf("*p=%c\n",*p);
++*p++; //自增运算
printf("p=%p\n",p);
printf("*p=%c\n",*p);
puts(str);
getch();
}
在上面代码中,p是一个指针变量,++p将p加1,++*p将*p所指单元加1,*p++只将p加1,++*p++将p加1,同时也将*p所指单元加1.程序运行结果如下:
* p=ffb8;
*p=c
* p=ffb9;
* chinese people
【答案】变量的自增自减是修改变量的值,指针的自增自减是修改指针的指向地址。