您的位置:首页 > 编程语言 > C语言/C++

2.c/c++程序员面试宝典-操作符

2015-11-09 17:06 489 查看
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

【答案】变量的自增自减是修改变量的值,指针的自增自减是修改指针的指向地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: