Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165168
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 399
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-04 15:36
文章分类

全部博文(24)

文章存档

2017年(2)

2015年(5)

2014年(9)

2013年(8)

我的朋友

分类: C/C++

2015-03-12 14:23:52

今天有位同事(职能部门同事)拿过来一道C语言测试题,说是上大学的小妹让帮忙看看,最好能给出解题思路来。
题意是这样的:


下面这段代码输出结果是16.00,问x应该是多少?
int main(int argc, char *argv[])
{
    int a = 9, b = 2;
    float x = ___, y = 1.1, z;

    z = a/2 + b * x / y + 1 / 2;
    printf("%5.2f\n", z);

    return 0;
}

可以先思考一下再往下看。



软件这边好几个人都愣住了,当然也包括我在内。经过一番思考后,我发现自己在不查任何资料的情况无法很肯定地给出一个计算结果出来,所以我打算动手来验证一下我计算的几个可能答案。
经过验证,我计算的几个可能答案都不正确。
正确结果是x=6.6
错误的计算思路就不提了,看看为什么会是6.6吧

z = a/2 + b * x / y + 1 / 2
1. z为float型,但'='的优先级是极低的,所以放在最后一步。
2. '+'和'-'的优先级低于'*'和'/',所以'='号面被分成三个小表达式了,即z = (a/2) + (b * x / y) + (1 / 2)
3. a为int型,那(a/2)结果为4了,(1/2)结果为0,即z = 4 + (b * x / y) + 0,进而 z - 4 = (b * x / y)
4. (b * x / y)当中只要有一个变量类型是float,表达式结果就是float型,所以再接下来计算全部要按float型计算,即(z - 4) * y / b = x

(z - 4) * y / b = x
(16.0 - 4) * 1.1 / 2 = 6.6

由此想到:
1. 我们太依赖机器了。已经将最初的理论全部还给书本了,自己思考的越来越少了,也许是因为我们将更多的精力花在了软件逻辑上了。
2. 是不是大学教育也有点脱节了,我们毕业后再没有用过,这说明这类知识不实用,但没有这理论知识也不可行,真是矛盾啊。


阅读(1792) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~