C 影响“中输出的括号”;";

C 影响“中输出的括号”;";,c,C,该程序用于计算系列1/1!+2/2! + ..... 直到输入给定的数字 这是我写的代码 /*我使用了5个变量和嵌套循环。我甚至不知道这是否是编写程序的好方法*/ 问题:当我如图所示(在完整代码下面)插入括号时,输出是不同的, 为什么会这样 #include <stdio.h> #include <conio.h> int main () { int a,i,n; float sum=0,prod; printf ("Enter the numbe

该程序用于计算系列1/1!+2/2! + ..... 直到输入给定的数字

这是我写的代码

/*我使用了5个变量和嵌套循环。我甚至不知道这是否是编写程序的好方法*/

问题:当我如图所示(在完整代码下面)插入括号时,输出是不同的, 为什么会这样

#include <stdio.h>
#include <conio.h>
int main ()
{
    int a,i,n;
    float sum=0,prod;
    printf ("Enter the number\n");
    scanf ("%d",&a);
    for (i=1;i<=a;i++)
    {   
        for (n=1;n<=i;n++)
        {   
            for (prod=1;n<=i;n++)
                prod = prod * 1/n;
        }
        sum = sum + prod*i;
    }
    printf ("sum = %f\n ",sum);
    getch();
    return 0;
}

请帮我做这件事,并提前表示感谢。

不带括号的声明

prod = prod * 1/n;  
将被解析为

prod = (prod * 1) / n;  
由于
*
/
的优先级相同,操作数从左到右关联。在这种情况下,
prod*1
除以
n

如果发生

prod = prod * (1/n); 
1/n
总是导致
0
并导致不同的结果。改成

prod = prod * (1.0/n);   
会有用的

产品=产品*(1/n);//错

这意味着首先执行
(1/n)
,即为零(两者均视为
int
,1小于
n

prod=prod*1/n;//正确的

这意味着
prod*1
首先完成(从左到右关联)-结果是
double
,因此最终结果
prod*1/n
也是double(这是正确的结果)

答案就在你的声明中:1和n是整数,而prod是一个浮点数,prod=prod*1/n=prod/n的结果就是正确的浮点数。
而prod=prod*(1/n)将是prod*0(对于n>1),因为1/n是int/int,结果是int。

prod*1/n
被解析为
(prod*1)/n
,并导致浮点除法


prod*(1/n)
使用一个整数除法,它将截断除法的结果(通常为0)。

C从左到右操作,以便看到

prod = prod * 1 / N;

它认为prod等于prod除以1,再除以n。把括号放在1/N的周围,你告诉C prod是用1/N乘以的,而不是用另一种方式。这就像在数学中一样,如果你把要单独评估的东西放在括号里,然后在完成时放回顺序中

如果不使用paradensis,则将语句解析为

prod = (prod * 1) / n;
由于
prod
是一个浮点数,
proad*1
也将是一个浮点数。然后该除法将是浮点除法

但是,如果您添加parantase,那么
(1/n)
将是整数除法,因为两个操作数都是整数。因此,
(1/n)
对于
n
>1将为零。然后,
prod
也将为零


无论如何,您的程序调用未定义的行为,因为
prod
尚未初始化。

您只需要一个循环。下面是我用Java编写它的方法。收敛速度很快。此系列近似于
e
的值

package math.series;

/**
 * SeriesSum approximates value for e
 * Created by Michael
 * Creation date 2/20/2016.
 * @link https://stackoverflow.com/questions/35528818/parenthesis-effecting-the-output-in-c
 */
public class SeriesSum {

    public static final int DEFAULT_NUM_TERMS = 5;

    public static void main(String[] args) {
        int n = (args.length > 0) ? Integer.parseInt(args[0]) : DEFAULT_NUM_TERMS;
        System.out.println(SeriesSum.summation(n));
    }

    public static double summation(int n) {
        double sum = 0.0;
        double term = 1.0;
        for (int i = 1; i <= n; ++i) {
            term *= i;
            sum += i/term;
        }
        return sum;
    }
}
package math.series;
/**
*SeriesSum近似于e的值
*迈克尔创作的
*创建日期2016年2月20日。
*@linkhttps://stackoverflow.com/questions/35528818/parenthesis-effecting-the-output-in-c
*/
公开课系列{
公共静态final int DEFAULT_NUM_TERMS=5;
公共静态void main(字符串[]args){
int n=(args.length>0)?Integer.parseInt(args[0]):默认的\u NUM\u术语;
系统输出println(级数和(n));
}
公共静态双求和(int n){
双和=0.0;
双项=1.0;

对于(int i=1;i,原因是您的代码与相关的数学语句不相等。请记住,C中的
/
不是除法,而是整数除法

它有效地将数学楼层函数添加到您的语句中。纯数学术语来说,您会发现:

Prod*floor(1/n)
floor(Prod*1/n)
不同

您希望在代码中使用非括号版本:
prod*1/n

但您还需要在每次迭代时将余数添加到总和中,因此:

Prod=(Prod/n)+(Prod%n);

请注意,这行代码中的括号纯粹是为了可读性,它不会更改计算

编辑:我认为在C语言中,如果
/
运算符上的一个操作数是浮点,那么它将执行浮点除法。如果是这种情况,则不需要将余数加到和中:


Prod=Prod/n;

问题是整数除法:1/n=0表示n>1你在学校没有学过乘法/除法运算符的优先级吗?结果会有什么变化?(反对票不是我的)@Frankie_C;
1/n
=0然后对答案进行澄清,因为你写的答案没有多大意义。@Frankie_C在这个答案中没有什么是没有意义的sense@DanielDowd
1/n
为零,而不是
n
为零
prod = (prod * 1) / n;
package math.series;

/**
 * SeriesSum approximates value for e
 * Created by Michael
 * Creation date 2/20/2016.
 * @link https://stackoverflow.com/questions/35528818/parenthesis-effecting-the-output-in-c
 */
public class SeriesSum {

    public static final int DEFAULT_NUM_TERMS = 5;

    public static void main(String[] args) {
        int n = (args.length > 0) ? Integer.parseInt(args[0]) : DEFAULT_NUM_TERMS;
        System.out.println(SeriesSum.summation(n));
    }

    public static double summation(int n) {
        double sum = 0.0;
        double term = 1.0;
        for (int i = 1; i <= n; ++i) {
            term *= i;
            sum += i/term;
        }
        return sum;
    }
}