请问:c语言中的括号使用
请教:c语言中的括号使用
今日做上机实验时发现下面两条式子算出的结果是相差很远的。
double s;
int i;
以下是循环计算公式:
s=s+(1.0/(2*i-1))+(1.0/(2*i));
s=s+(1.0/(2*i-1))+(1.0/2*i);
看了很久,没弄明白。请大家指点一下!谢谢!
------解决方案--------------------
“1.0/(2*i)”和“1.0/2*i”怎么可能一样呢?
C/C++语言中,“/”和“*”的优先级是相同的,且都是左结合,所以,当没有括号的时候,1.0/2*i就是先除以2,再把所得的商乘以2,这样,显然就等同于:2.0 * i / 2,跟前面那个带括号的完全不是一回事嘛。
------解决方案--------------------
s=s+(1.0/(2*i-1))+(1.0/2*i)等价于s=s+(1.0/(2*i-1))+(0.5*i)
当i=3时(0.5*i)=1.5
而1.0/(2*i)=1/6=0.1666666
这就是差距
原因在于优先级
------解决方案--------------------
其实不仅在C/C++语言中,就算在数学上,也是这样的,哪个小学老师说:
1.0 ÷ ( 2 × i);
等同于
1.0 ÷ 2 × i;
了?是不是你先入为主地在脑子里把那个“/”给横起来了,都给想像成:
1.0
-----
2 * i
了?呵呵。
------解决方案--------------------
@@
+( 1.0 / (2*i) );
+( 1.0/2 * i );
2个式子相差 1/(i^2)倍或者说是i^2倍
------解决方案--------------------
“2.0 * i / 2”?应该是“1.0*i/2”吧?
——当然了,C/C++又不太限制空格,跳格,回车等的使用,不过通常在运算符和操作数之间加个空格,代码看起来会让人舒服一些。
对于优先级不同的情况,当然按照优先级来,比如:
a + b * c;
由于*优先级高,所以先算b * c,即相当于:“a + (b * c)”。但当优先级相同时,就要看结合性了,比如:
a + b - c;
由于+和-优先级相同,而加减都是左结合,所以先算加,再算减,即相当于:“(a + b) - c”。(当然,在这个例子中,先算谁结果都一样,但编译器会先算加的)
对于右结合的情况,则是先算右边的,比如赋值符“=”中右结合的,因此,“a = b = c”相当于:“a = (b = c)”,因为“=”当然跟它自身优先级相同,所以此时右结合性决定了先算右边的。
你的例子中,a / b * c跟a / (b * c)当然是不一样的,因为前者相当于:(a / b) * c。
今日做上机实验时发现下面两条式子算出的结果是相差很远的。
double s;
int i;
以下是循环计算公式:
s=s+(1.0/(2*i-1))+(1.0/(2*i));
s=s+(1.0/(2*i-1))+(1.0/2*i);
看了很久,没弄明白。请大家指点一下!谢谢!
------解决方案--------------------
“1.0/(2*i)”和“1.0/2*i”怎么可能一样呢?
C/C++语言中,“/”和“*”的优先级是相同的,且都是左结合,所以,当没有括号的时候,1.0/2*i就是先除以2,再把所得的商乘以2,这样,显然就等同于:2.0 * i / 2,跟前面那个带括号的完全不是一回事嘛。
------解决方案--------------------
s=s+(1.0/(2*i-1))+(1.0/2*i)等价于s=s+(1.0/(2*i-1))+(0.5*i)
当i=3时(0.5*i)=1.5
而1.0/(2*i)=1/6=0.1666666
这就是差距
原因在于优先级
------解决方案--------------------
其实不仅在C/C++语言中,就算在数学上,也是这样的,哪个小学老师说:
1.0 ÷ ( 2 × i);
等同于
1.0 ÷ 2 × i;
了?是不是你先入为主地在脑子里把那个“/”给横起来了,都给想像成:
1.0
-----
2 * i
了?呵呵。
------解决方案--------------------
@@
+( 1.0 / (2*i) );
+( 1.0/2 * i );
2个式子相差 1/(i^2)倍或者说是i^2倍
------解决方案--------------------
“2.0 * i / 2”?应该是“1.0*i/2”吧?
——当然了,C/C++又不太限制空格,跳格,回车等的使用,不过通常在运算符和操作数之间加个空格,代码看起来会让人舒服一些。
对于优先级不同的情况,当然按照优先级来,比如:
a + b * c;
由于*优先级高,所以先算b * c,即相当于:“a + (b * c)”。但当优先级相同时,就要看结合性了,比如:
a + b - c;
由于+和-优先级相同,而加减都是左结合,所以先算加,再算减,即相当于:“(a + b) - c”。(当然,在这个例子中,先算谁结果都一样,但编译器会先算加的)
对于右结合的情况,则是先算右边的,比如赋值符“=”中右结合的,因此,“a = b = c”相当于:“a = (b = c)”,因为“=”当然跟它自身优先级相同,所以此时右结合性决定了先算右边的。
你的例子中,a / b * c跟a / (b * c)当然是不一样的,因为前者相当于:(a / b) * c。