|
|
|
|
移动端

1.10.2 ++与 --

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

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

开发者盛宴来袭!7月28日51CTO首届开发者大赛决赛带来技术创新分享

1.10.2 ++与 --

【真题 132】以下代码的运行结果为()。

  1. #include<stdio.h> 
  2. int main()  
  3. {  
  4. int a = 100;  
  5. while (a > 0)  
  6. {  
  7. --a;  
  8. }  
  9. printf("%d", a);  
  10. return 0;  

A.-1B.100 C.0 D.死循环

答案:C。

对于 while循环而言,只要循环条件( while语句后面括号内的表达式的值)为真,则循环一直进行下去,对于前置自减运算符--而言,当运算结束后,变量的值会减 1。(备注:需要注意区分前置运算符与后置运算符的差别)

本题中,while循环的条件是变量 a的值大于 0,由于 a的初始化值为 100,当代码执行时,会进入 while循环内执行,由于执行了一次自减操作,于是变量 a的值变为 99,由于 a的值此时仍然大于 0,此时循环继续执行,直到 a的值变为 0,不满足 while循环的条件,此时循环终止,昀终变量 a的值为 0。因此,选项 C正确。

【真题 133】如果 x = 1 , y= 2 , z = 3,则表达式 y+=z--/++x 的值是()。

A.3B.3.5 C.4D.4.5答案:A。在编程的时候,经常会用到变量的自增或自减操作,尤其在循环中用的昀多。以自增为例,有两种

自增方式:前置与后置,即 ++i和 i++,它们的不同点在于 i++是在程序执行完毕后自增,而 ++i是在程序开始执行前进行自增。

对于本题而言,在执行语句 y+=z--/++x的时候, z--是在这个表达式计算结束后才执行自减操作,在这个表达式中, z的值为 3,在表达式计算完成后, z的值变为 4,而++x则不同,会首先执行 x自增操作,x的值变为 2,然后参与运算,上面表达式等价于 y+=3/2,显然,3/2=1(运算结果需要被转换为 int类型,丢弃掉小数部分)。y的值变为 3。所以,选项 A正确。

【真题 134】下面代码的输出结果是什么?

  1. #include<stdio.h> 
  2. int main()  
  3. {  
  4. int a, b, c, d;  
  5. a = 10;  
  6. b = a++;  
  7. c = ++a;  
  8. d = 10 * a++;  
  9. printf("%d,%d,%d", b, c, d);  
  10. return 0;  

答案:10,12,120。

本题中,变量 a的值被初始化为 10,当执行完语句 b=a++后,变量 a的值变为 11,而变量 b的值变为 10。当执行完语句 c=++a后,a的值变为 12,而变量 c的值变为 12。当执行完语句 d=10*a++后,变量 a的值变为 13,而变量 d的值变为 120。所以,变量 b、c、d的值分别为 10、12、120。

【真题 135】设 int arr[]={6,7,8,9,10};

  1. int *ptr=arr;  
  2. *(ptr++)+=123;  
  3. printf("%d,%d",*ptr,*(++ptr)); 

程序的输出结果为()。

答案:答案是不确定的。因为参数是从左到右执行还是从右到左执行,规范是没有规定的,不同的编译器可能会有不同的实现方式。

目前来讲,大部分的编译器都采用从右到左的执行方式。在这种情况下,在执行完语句 *(ptr++)+=123后,ptr指向 7,在执行 printf语句的时候,由于从右到左执行,因此,先执行 *(++ptr),显然结果为 8,

当输出*ptr的时候,由于 ptr已经指向 8了,因此,也输出 8。所以,对于这类编译器,输出结果为 8,8。如果碰到从左向右执行的编译器输出结果则为 7,8,因为此种写法的执行过程与编译环境有着非常紧密的联系,所以,在编写代码的时候,尽量避免采用这种写法。

【真题 136】以下四个表达式写法是否正确?如果正确,写出经过表达式运算后 a的值。

  1. int a = 4

A. a += (a++); B. a += (++a) ; C. (a++) += a; D. (++a) += (a++); 答案:表达式 C与表达式 D错误。表达式 C和表达式 D等号左边都是个具体的数值,不是一个合法的左值。选项 A运算结束后 a的值为 9;选项 B运算结束后 a的值为 10。

【真题 137】假设 i=2,那么表达式 (i++)/3的值为()。答案:0。表达式的值为 2/3(计算结束后, i的值变为 3),运算结果的值与 i的类型相关,如果变量 i为 int

类型,那么结果为 0。

【真题 138】有如下代码:

  1. main()  
  2. {  
  3. char a='1',b='2';  
  4. printf("%c, ",b++);  
  5. printf("%d\n",b-a);  

在计算机中,数字字符 0的 ASCII值为 48,以上程序运行之后的输出结果是()。

A.3,2 B.50,2 C.2,2 D.2,50 答案:C。在计算机中,由于数字字符 0的 ASCII值是 48,所以,数字 1的 ASCII值是 49,数字 2的 ASCII

值是 50,数字 3的 ASCII值是 51。当执行到语句 printf("%c, ",b++)时,由于是后置 ++运算,所以, b++返回的还是 b的值,b表示字符 2,而打印输出的格式为字符,打印输出为字符 2。当执行到语句 printf("%d\n",b-a)时,由于经过 b++运算后, b的 ASCII值由 50变为了 51,而此时 a的 ASCII值仍然为 49,b-a=2,此时输出的是整数,因此,输出为整数 2。所以,选项 C正确。

【真题 139】下列表达式正确的是()。

A.9++ B.(x+y)++ C.c+++c+++c++  D.++(a-b--) 答案:C。在 C/C++语言中,自增运算符 ++与自减运算符--都具有对运算量重新赋值的功能,因为常量与表达

式在内存中没有存储单元,所以,自增运算符 ++与自减运算符--只能用在变量(包括整型、实型,还有字符型、枚举型等标准类型)上,而不能作用于常量或表达式上,而且,这两个运算符( ++与--)的运算优先级高于加法运算符 +和减法运算符-,低于括号运算符 ()。

本题中,对于选项 A,9是一个数字常量,显然,对其进行自增运算是非法的。所以,选项 A错误。

对于选项 B,对表达式 x+y进行了自增运算,显然,该运算也是非法的。所以,选项 B错误。

对于选项 C,表达式看似复杂,其实也不难理解,表达式的意思是对变量 c执行三次自增运算,昀

后再将它们相加,该过程是合法的。所以,选项 C正确。对于选项 D,对表达式 a-b--执行自增运算,显然,该表达式是非法的。所以,选项 D错误。

【真题 140】执行 C语言代码“ int a=1; int b=0; int c=0; int d=(++a)*(c=1);”后,变量 a、b、c、d的值分别为()。

A.2,0,1,2 B.1,0,1,1 C.2,0,1,1 D.2,0,0,2 答案:A。在解答本题之前,首先要弄懂前置 ++/--运算符与后置 ++/--运算符的运算原理以及二者之间的

区别。以变量 i为例, i++与++i这两种方式都会使得 i自增 1,不同之处在于其内部实现, ++i运算表示先取 i的地址,增加它的内容,然后把结果放在寄存器中,而 i++表示首先取 i的地址,把它的值装入寄存器,然后增加内存中的 i的值。《 Google C++编程风格》一书中强调,对于迭代器和其他模板对象使用前缀形式( ++i)的自增、自减运算符,因为前置自增( ++i)通常要比后置自增( i++)效率更高。

本题中,语句 d=(++a)*(c=1)的执行过程如下:执行 ++a运算后,变量 a的值变为 2,执行 c=1运算后,变量 c的值变为 1,而 d=2*1=2。由于变量 b被初始化为 0后,一直没有被修改, b的值为 0。所以,选项 A正确。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

The Ruby Way(第二版)中文版

本书采用“如何解决问题”的方式阐述Ruby编程,涵盖了以下内容:Ruby术语和基本原理;数字、字符串等低级数据类型的操作;正则表达式;国际...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊