image

编辑人: 流年絮语

calendar2025-11-27

message1

visits254

唯一一次笔试的经历——江苏软件实训基地笔试

它前一部分是纯英语笔试,10道选择题再加一道阅读理解,接下来就是比较正常的技术题,主要是考C的,来谈谈几道比较有意思的题。
有一道是考单目运算符“++”,原题大概是int d=0,a=1;d=10*a++。解法是先算10*a赋给d,再把a++,所以d=10,a=2。是不是觉得还算简单,下面来两道复杂的。
第一道:
int a,x;
for(a=0,x=0;a<=1 && !x++;a++)
{
a++;
}
printf(“a=%d,x=%dn”,a,x);

for (a=0,x=0;a<=1 && !x++;)
{
a++;
}
printf(“a=%d,x=%dn”,a,x);
以上两行输出,有何不同?
这里尤其要注意的是&&符,当a=2时a<=1为假,则后面的“!x++”就不执行,所以第一行输出a=2,x=1,第二行输出a=1,x=2。也不是很难对吧,来看下一道。
第二道:
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf(“%d,%dn”,*ptr,*(++ptr));
如果你能正确的说出结果,说明你C语言学的还不错。
我们来分析一下,*(ptr++)+=123应为*ptr=*ptr+123;ptr++,所以数组的第一个元素变为129,ptr指向第二个元素7。接下来是个难点,你首先要知道C中printf计算参数时是从右到左压栈的,所以printf(“%d,%dn”,*ptr,*(++ptr))从右到左运算,先压*(++ptr),因为是++ptr,所以ptr先++,这时ptr指向数组第三个元素8(如果是ptr++,则跳出函数再++,这时ptr还是指向7),所以输出结果为8,8。
是不是觉得“++”已经有点变态了,其实还不算,Java中的“++”更让人纠结,请看下面这道:
int count = 0;
count += count++;
System.out.println(count);
想想输出结果是什么?结果是0。“++”不管用了,这是为什么呢?让我们先看个简单点的:
int i = 0;
i = i++;
System.out.println(i);
输出结果还是0,晕啊,这是为什么呢,“++”都干什么去了。
这就要牵扯到Java虚拟机的内容了,我涉猎不深,结合查到的资料和我的理解,解释如下。
对于赋值表达式运算优先级的问题,核心在于:赋值运算应该在最后进行。
对于i=i++这个语句:
第一步,表达式运算,计算 i++ 表达式的值(设为 x ,当前x=0),并保存到某个内存地址,当前 i=0;
第二步,自增变量值运算,计算 i++ 对 i 的影响 (i=i+1, i=1),并保存到变量 i 的内存地址,当前 i=1;
第三步,赋值运算,从内存地址中获取第一步的计算结果(表达式的值x,当前x=0)赋值给 i,当前 i=0;
运算结束后 i=0。
即”i = i++;”不是等价于(C语言的) “i = i; i = i + 1;”,而是(逻辑)等价”x = i; i = i + 1; i = x”,所以结果是0 。
顺便提一下”i = ++i”(逻辑)等价”i = i + 1; a = i; i = a”,所以结果会是1。
即i = x赋值总是在i = i + 1操作的后头,原理是从右到左计算,赋值运算应该在最后进行。
是不是有点头大了,没关系,来一个总结,总结如下:
一般的赋值表达式,计算优先级为:
1、计算各单元的值
2、计算表达式的值
3、赋值
好,先来道复杂点的练练手:
i=i++ + i++;[内存中 i=0]
运算过程:
1、i=0 + i++ [内存中 i=1];
2、i=0+ 1 [内存中 i=2];
3、i=1 [内存中 i=2];
4、输出结果为1。
好了,理解到这里就够了,谁编程没事来一串的“++”,现在回到我们最开始的问题count += count++。
首先根据优先级问题,右边的+=操作应该最先执行,所以(逻辑)等价与“count += count;x=count;count = count + 1;count = x”(这里我的理解有点虚,如果有更好的解释可以告诉我),即结果就是count的两倍,所以如果count初值为2时,结果为4,这也就可以解释count += ++count 结果为5(初值也为2)的原因:(逻辑)等价与“count += count;count = count + 1;x=count;count = x”。
Over了,累死我了。本来想多总结几道,一道就写了这么多,想对Java“++”这类问题理解的更深,就去看看Java虚拟机的内容吧。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:唯一一次笔试的经历——江苏软件实训基地笔试

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share