|
|
|
|
移动端

1.10.1 常规运算(1)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍常规运算。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:08

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.10 运算

1.10.1 常规运算(1)

【真题 120】定义有变量 int i = 0; int a = i++; int b=++a; int c = a+b;,那么表达式 a?b:c的值为()。

A.0 B.1 C.2 D.3 答案:B。对于变量 a,当使用前置运算符修饰时,即 ++a表示的意思是先取 a的地址,增加它的内容,然

后再把值放在寄存器中;当使用后置运算符修饰时,即 a++表示的意思是先取 a的地址,再把它的值装入寄存器,然后增加内存中 a的值。一般而言,当涉及表达式计算时,对这两种情况的计算过程区分如下:后置的 ++运算符是先将其值返回,然后其值增 1;而前置的 ++运算符,则是先将值增 1,再返回其值。

对于本题而言,语句 int a = i++的执行过程如下:首先,取 i的值返回并赋值给 a,此时 a的值变为 0,然后,i的值变为 1。语句 int b=++a的执行过程如下:首先, a执行自增操作, a的值变为 1,然后,再把自增后的值赋值给 b,变量 b的值为 1。接着执行语句 c=a+b=0+1=1,对于表达式 a?b:c的值而言,因为变量 a的值为 0,等价于 false,所以, a=c=1。因此,选项 B正确。

【真题 121】如果在某系统中,等式 15*4=112成立,则系统采用的是()进制。

A.6 B.7 C.8 D.9 答案:A。本题可以采用假设法来求解。假设采用的是六进制,那么计算过程为: 4*5=20,20/6=3,20%6=2,

因此,4*5的结果等于 2,进位值为 3。接着计算 1*4+3(进位值)=7,由于 7/6=1,7%6=1,因此,计算结果为 1,进位为 1。所以,计算结果为 112。符合题目预期。因此,假设成立。而选项 B、选项 C和选项 D中的三种假设都不满足题意。根据排除法,只有选项 A正确。

【真题 122】除了十进制、二进制之外,十六进制表达式在计算机领域中也经常使用(例如各种字

符集的定义描述),下式:(2012)10+(AF1)16的结果是()(请用十进制表示)。

答案:4813。

本题是一道有关进制转换的题目,只需要将十六进制数表示为十进制数,然后再与另外一个十进制

数进行求和即可。所以, AF1(16)=10*16*16+15*16+1=2801(10),二者求和 2012(10)+2801(10),结果为 4813(10)。

【真题 123】下面不能被重载的运算符有()。

A.作用域运算符“ ::” B.对象成员运算符“ .”

C.指针成员运算符“->” D.三目运算符“ ? :”
答案:A、B、D。
C++语言中能被重载的运算符有如下几种:


1)算术运算符:

+、-、*、/、%、++、--。

2)位操作运算符:

&、|、~、^(位异或)、<<(左移)、>>(右移)。

3)逻辑运算符:

!、&&、||。

4)比较运算符:

<、>、>=、<=、==、!=。

5)赋值运算符:

=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。

6)其他运算符:

[]、()、->、,(逗号运算符 )、new、delete、new[]、delete[]、->*。

不能重载的运算符有 5个,分别为 . 、?:、sizeof、:: 、.*。

【真题 124】给定 3个 int类型的正整数 x、y、z,对如下 4组表达式进行判断,正确的选项是()。

  1. int a1=x+y-z; int b1=x*y/z;  
  2. int a2=x-z+y; int b2=x/z*y;  
  3. int c1=x<<y>>z; int d1=x&y|z;  
  4. int c2=x>>z<<y; int d2=x|z&y; 

A.a1一定等于 a2 B.b1一定等于 b2 C.c1一定等于 c2 D.d1一定等于 d2 答案:A。本题中涉及的运算符有 +、-、 *、/、<<、>>、&、|等。本题中,对于选项 A,整型变量 a1与整型变量 a2的运算只涉及了加法运算符 +与减法运算符-,

这两个符号的运算满足交换律,表面上看,二者确实是相等的。但是,细心的读者可能会有疑问了,很有可能存在一种特例,就是数据溢出了,交换律是否还成立呢?假设 x与 y的和发生了溢出,那么此时 a1与 a2还能一定相等吗?回答还是肯定的。即使 x与 y的和值发生了溢出,其结果仍然是相等的。

当发生溢出时,假设整型变量 x与整型变量 y同号(要么同时为正整数,要么同时为负整数),会

存在以下几种情况:情况一: x与 y同号,都为正数。针对 x与 y都为正整数的情况,当 x与 y的和值发生溢出时,那么溢出后的值为昀大的负数,这个昀大的负数再减去整型数 z,其符号有一次改变。符号改变了两次,相当于昀高位的值没有改变。而这个时候 x-z+y因为同号也不可能符号改变,低位又都是直接相加,所以, x-z+y与 x+y-z一样。还有就是 x和 y与 z不同号,这个时候就更容易了, x+y-z溢出,x-z+y同样溢出,符号位改变一次,所以,二者也相等。情况二: x和 y同号为负数,其实和情况一一样,这里不再赘述。

其实对于计算机而言,任何两个数相加 a+b(包括负数, -1-2在计算机看来就是-1+(-2),注意负数在计算机中存放的特殊性),在计算的时候是直接取出表示这个数字的字节,然后从低位到高位相加,昀后得出来一个结果,无论是有符号还是无符号都再把这个结果翻译成对应的数即可。

  1. #include <iostream> 
  2. using namespace std;  
  3. int main()  
  4. {  
  5. char x = 126;  
  6. char y = 24;  
  7. char z = 65;  
  8. char a1 = x + y - z; // x + y 有溢出,但是 - z 后可以减回来  
  9. char a2 = x - z + y;  
  10. cout << (int)a1 << endl;  
  11. cout << (int)a2 << endl;  
  12. return 0;  

所以,选项 A正确。

对于选项 B,涉及整数的除法运算。

其实,C/C++语言中的除法运算符 /与求余运算符 %,都为二元运算符,具有左结合性。它们通常遵循以下几点规律:

1)整数除法结果的小数部分都被丢弃,这个过程称为“截尾”( truncation)。

2)相同数据类型的数据、变量进行运算,结果保持原有数据类型。当不同数据类型的数据、变量进行运算时,结果为精度高的数据类型。例如,整数与浮点数进行混合除法运算时,其结果都是浮点数。

3)对负数的整数除法, C99要求使用“趋零截尾”。即除号的正负取舍和一般的算数一样,符号相同为正,相异为负。

4)对负数的取模运算, C99规定:如果第一操作数为负数,那么得到的模为负数,如果第一操作

数为正数,那么得到的模为正数。例如: 7/4=1,-7/4=-1,7/-4=-1,-7%4=-3,7%-4=3。根据以上的分析可知,由于整数除法的截断, b1和 b2不一定相等。以如下程序为例。

  1. #include<iostream> 
  2. using namespace std;  
  3. int main()  
  4. {  
  5. int x = 3;  
  6. int y = 4;  
  7. int z = 12;  
  8. int b1 = x * y / z;  
  9. int b2 = x / z * y;  
  10. cout << b1 << endl; // 1  
  11. cout << b2 << endl; // 0  
  12. return 0;  

程序的运行结果为:

  1. 1  

所以,选项 B不正确。

对于选项 C,左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补 0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补 0,或者补符号位,这由不同的机器而定。由于移位会丢弃超出位,所以, c1和 c2不一定相等。以如下程序为例。

  1. #include<iostream> 
  2. using namespace std;  
  3. int main()  
  4. {  
  5. int x = 2;  
  6. int y = 2;  
  7. int z = 2;  
  8. int c1 = x << y >> z; // 2 先乘以4,再除以4  
  9. int c2 = x >> z << y; // 2 先除以4,再乘以4  
  10. cout << c1 << endl; // 2  
  11. cout << c2 << endl; // 0  
  12. return 0;  

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP快速建站全程实录

本书从一个网站制作过程入手,详细介绍基于ASP技术建设网站的全过程。全书共10章。第1章,网站制作规划与流程;第2章,IIS安装与调试;第3...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊