鱼C论坛

 找回密码
 立即注册
查看: 1476|回复: 8

[已解决]关于运算优先级的式子

[复制链接]
发表于 2020-10-8 16:25:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>


int main(void)
{
    int a,b;
    a = 9;
    b = (++a)+(++a);

    printf("%d",b);

    return 0;
}


中为什么计算出来的结果b=22?不应该是20?
最佳答案
2020-10-10 09:33:09
这么久没见你结帖,你是对加加减减运算不熟悉吧?给你一个程序,运行试试看
#include<stdio.h>

int main()

{
      int j = 3,i = 5;
      printf("j = 3,  i = 5\n");
      printf("\n");
      j = j * (i++);
      printf("j = j * (i++) 运算后的结果是:%d, %d",j,i);
      printf("       // 先运算,再自加");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (i--);
      printf("j = j * (i--) 运算后的结果是:%d, %d",j,i);
      printf("       // 先运算,再自减");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (++i);
      printf("j = j * (++i) 运算后的结果是:%d, %d",j,i);
      printf("       // 先自加,再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (--i);
      printf("j = j * (--i) 运算后的结果是:%d, %d",j,i);
      printf("       // 先自减,再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (+i);
      printf("j = j * (+i)  运算后的结果是:%d, %d",j,i);
      printf("       // 保持符号再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (-i);
      printf("j = j * (-i)  运算后的结果是:%d, %d",j,i);
      printf("      // 改变符号再运算\n");
      printf("\n");

      printf("单一的 i+ 或单一的 i-                    // 没有意义,并且系统会报错\n");
      printf("\n");

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-8 16:47:32 | 显示全部楼层
本帖最后由 大裤衩子 于 2020-10-8 16:52 编辑

我的理解
#include <stdio.h>


int main(void)
{
    int a = 9;

    ++a; // 10   // 第一次调用++a 此时 a== 10
    ++a; // 11   // 第二次调用++a 此时 a== 11; 注意:同时第一次++a的值被也为11。
    printf("%d\n",a);
    //printf("%d\n",(++a)+(++a));  // 即 11 + 11 = 22
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 17:01:05 | 显示全部楼层

????那是遵循什么运算规则吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 17:37:45 | 显示全部楼层
烂冬瓜狮子头 发表于 2020-10-8 17:01
????那是遵循什么运算规则吗???

++a 先运算再赋值的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 21:54:10 | 显示全部楼层
++a 是自增,后运算;
a++ 是运算,后自增;

() 的运算高于 + 号,所以是先对两个括号里进行运算,最后才运算中间那个加号:

(++a) 第一个括号运算后 = 10,(++a) 第二个括号运算后 =11,(++a) + (++a) = 11 + 11 = 22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 09:33:09 | 显示全部楼层    本楼为最佳答案   
这么久没见你结帖,你是对加加减减运算不熟悉吧?给你一个程序,运行试试看
#include<stdio.h>

int main()

{
      int j = 3,i = 5;
      printf("j = 3,  i = 5\n");
      printf("\n");
      j = j * (i++);
      printf("j = j * (i++) 运算后的结果是:%d, %d",j,i);
      printf("       // 先运算,再自加");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (i--);
      printf("j = j * (i--) 运算后的结果是:%d, %d",j,i);
      printf("       // 先运算,再自减");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (++i);
      printf("j = j * (++i) 运算后的结果是:%d, %d",j,i);
      printf("       // 先自加,再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (--i);
      printf("j = j * (--i) 运算后的结果是:%d, %d",j,i);
      printf("       // 先自减,再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (+i);
      printf("j = j * (+i)  运算后的结果是:%d, %d",j,i);
      printf("       // 保持符号再运算");
      printf("\n");
      j = 3,i = 5;
      printf("\n");
      j = j * (-i);
      printf("j = j * (-i)  运算后的结果是:%d, %d",j,i);
      printf("      // 改变符号再运算\n");
      printf("\n");

      printf("单一的 i+ 或单一的 i-                    // 没有意义,并且系统会报错\n");
      printf("\n");

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 18:55:46 | 显示全部楼层
从应用角度来看这种问题真的没有任何意义,奇怪的是大学里的C语言考试一定会有这样的题,真是让人无语。

你只需要知道++a 和 a++ 有什么不同就好了,实际应用的时候不要用这种运算写复杂表达式

不确定优先级的时候就加括号

本应该是编译器干的事情就不要过多的投入精力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 21:46:51 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-10-10 21:48 编辑
你只需要知道++a 和 a++ 有什么不同就好了,实际应用的时候不要用这种运算写复杂表达式


产生这个问题的原因有两方面:
1、是新手刚进入论坛,不懂论坛的规则,担心选择最佳答案会扣除他本人的荣誉或经验什么的,导致他们得到最佳答案后,不愿意去结帖;
2、是论坛版主不给力,没有及时地帮助新手们结帖,于是就导致大家以为他没有获得最佳答案,一个个地进来回复帖子,造成人力物力的极大浪费。其实只要论坛版主及时地帮助他们结帖了,发帖者也会有一个正确的导向,如果他还没有想明白他的问题,他应该会思考,他之前所学的,是否出现了误差,于是对照结帖给出的正确答案,也可以帮助他叫正他之前对概念的一些错误理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 13:37:29 | 显示全部楼层
真是非常感谢大家,我已经解决了问题,同时也有了更多的思考,这几天也在忙很多的事情,没有结帖很抱歉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表