int a=1,b=3,c=3;float d=4;能正确表示a/[(b+c)d]的是

来源:百度知道 编辑:UC知道 时间:2024/09/24 04:42:32
是一道练习题,原题是这样的:
已有定义语句int a=1,b=3,c=3;float d=4;
以下能正确表示数学式子a/[(b+c)d]的C语言表达式是:
a/(b+c)*d
a/(b+c)*1/d
a/(b+c)/d
a/d/(b+c)
有一答案说题目中“以下能正确表示数学式子”印错了,应该是“以下不能正确表示数学式子”,答案是第一个选项。
可是我想不对吧,由于类型问题,先算哪个后算哪个结果是不同的,请问一下各位高手,能告诉我标准答案吗?非常感谢!

选a/d/(b+c)
首先,从数学意义上考虑,a/(b+c)*1/d,a/(b+c)/d和a/d/(b+c)这3个表达式和a/[(b+c)d]是等价的
其次,考虑到C语言中/运算的性质,a/(b+c)*1/d和a/(b+c)/d这2个式子a/(b+c)这步运算a和b+c的商如果是小数的话,小数部分会被截断,这个例子中a/(b+c)=1/6=0,因此结果是不对的
但是a/d/(b+c),因为a/d是int/float,运算的时候会先把a转换成float,所以相当于1.0/4.0=0.25,由于a/d结果是一个float,所以计算0.25/(b+c)的时候,也会把b+c的结果6转换成float,也就是0.25/6.0,所以最后结果是和数学表达式a/[(b+c)d]相等的

标准答案是 D
B和C在数学里是一样的。
但是C语言有个整除的问题。
a/(b+c) = 0
就是说,遇到分子分母都是整数,就会按整数除法得到 0
不信自己编程试试。

所以要算1/7 必须写 (double)1/7

考查“优先级”的顺序和“/”是不是整除:
乘法和除法是同一等级,所以从左到右依次计算;
当“/“的两边都是整数时,是整除,而有一个为实数时则进行实数除法;

以下能正确表示数学式子a/[(b+c)d]的C语言表达式是(D)
(A)a/(b+c)*d=0
(B)a/(b+c)*1/d=0
(C)a/(b+c)/d=0
(D)a/d/(b+c)=0.04167

第四个是正确的
其他的a/*之后结果为0
因为都是int型
明白吗?