烂冬瓜狮子头 发表于 2020-10-8 16:25:28

关于运算优先级的式子

#include <stdio.h>


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

    printf("%d",b);

    return 0;
}


中为什么计算出来的结果b=22?不应该是20?

大裤衩子 发表于 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;
}

烂冬瓜狮子头 发表于 2020-10-8 17:01:05

大裤衩子 发表于 2020-10-8 16:47
我的理解

????那是遵循什么运算规则吗???

大裤衩子 发表于 2020-10-8 17:37:45

烂冬瓜狮子头 发表于 2020-10-8 17:01
????那是遵循什么运算规则吗???

++a 先运算再赋值的

乐乐学编程 发表于 2020-10-8 21:54:10

++a 是自增,后运算;
a++ 是运算,后自增;

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

(++a) 第一个括号运算后 = 10,(++a) 第二个括号运算后 =11,(++a) + (++a) = 11 + 11 = 22

风过无痕1989 发表于 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");

}

SHRS23 发表于 2020-10-10 18:55:46

从应用角度来看这种问题真的没有任何意义,奇怪的是大学里的C语言考试一定会有这样的题,真是让人无语。

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

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

本应该是编译器干的事情就不要过多的投入精力

风过无痕1989 发表于 2020-10-10 21:46:51

本帖最后由 风过无痕1989 于 2020-10-10 21:48 编辑

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

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

烂冬瓜狮子头 发表于 2020-10-13 13:37:29

真是非常感谢大家,我已经解决了问题,同时也有了更多的思考,这几天也在忙很多的事情,没有结帖很抱歉。
页: [1]
查看完整版本: 关于运算优先级的式子