heng_zou 2023-11-27 02:47 采纳率: 50%
浏览 1

C语言表达式的运算符的优先级问题

以计算斐波那契数列(0,1,1,2,3,5,8,13...后一个数等于前两个数之和)为例,使用Java语言编写如下代码没有问题能正常计算结果。

 void fibonacci(int n) {
        if (n < 0)
            System.out.println("n不能小于0");
        if (n == 0)
            System.out.printf("第%d位斐波那契数为:%d\n", n + 1, 0);
        else if (n == 1 || n == 2)
            System.out.printf("第%d位斐波那契数为:%d\n", n + 1, 1);
        else {
            int res = 2, pre = 1;
            for (int i = 4; i <= n; i++) {
                res = pre + (pre = res);
            }
            System.out.printf("第%d位斐波那契数为:%d\n", n + 1, res);
        }
    }

但同样的逻辑使用C语言则计算结果错误(0,1,1,2,4,8,16,32),似乎对于循环体中:res = prev + (prev = res);表达式的计算是先执行了括号内的赋值操作然后再求和的。c底层是如何实现这种表达式的计算的?

void fibonacci(int n) {
    if (n < 0) {
        puts("n不能小于0");
    } else if (n == 0) {
        printf("第%d位斐波那契数列为:%d\n", n + 1, 0);
    } else if (n == 1 || n == 2) {
        printf("第%d位斐波那契数列为:%d\n", n + 1, 1);
    } else {
        int res = 2, prev = 1;
        for (int i = 4; i <= n; i++) {
            res = prev + (prev = res);
        }
        printf("第%d位斐波那契数列为:%d\n", n + 1, res);
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-27 04:07
    关注

    【以下回答由 GPT 生成】

    这个问题中,C语言的表达式res = prev + (prev = res);在循环中的行为与Java语言中不同。其实,这个问题与C语言中运算符的优先级有关。在C语言中,赋值操作符(=)的优先级比加法操作符(+)低。因此,当计算这个表达式时,C语言会先执行括号内的prev = res语句,然后将prev的值赋给res,然后再计算res + prev的值。这就解释了为什么C语言中的结果不同于Java语言的结果。

    要解决这个问题,可以通过添加额外的变量来保存中间结果,然后再进行赋值和相加操作。以下是修改后的C代码示例:

    void fibonacci(int n) {
        if (n < 0) {
            puts("n cannot be less than 0");
        } else if (n == 0) {
            printf("The %dth Fibonacci number is: %d\n", n + 1, 0);
        } else if (n == 1 || n == 2) {
            printf("The %dth Fibonacci number is: %d\n", n + 1, 1);
        } else {
            int res = 2, prev = 1, temp;
            for (int i = 4; i <= n; i++) {
                temp = prev;
                prev = res;
                res = res + temp;
            }
            printf("The %dth Fibonacci number is: %d\n", n + 1, res);
        }
    }
    

    通过这种方式,我们可以确保在进行赋值和相加操作时,使用的是同一轮循环中的prevres的值。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月27日

悬赏问题

  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染