zoukankan      html  css  js  c++  java
  • C语言更多的运算符(进阶篇十七)

      复合运算符

        算术运算符后面加=号,便成为复合运算符

          如:

            i+=5;

            相当于i=i+5;

            那么i-=a+b;等价于什么?

          注意:i*=a+b;并不等价于i=i*a+b,而是等价于i=i*(a+b)

        +-*/%5个算术运算符都可以和=号组合成复合运算符,除此之外还有位运算符也可与=号组合成复合运算符。

      逗号运算符

        逗号运算符的运算顺序为从左到右,计算结束后取最右边的表达式作为运算结果。

          如:

            int a;

            a=(3+5,4+6);

            a的结果为10。

        在循环中经常见到:

          for(i=0;i<=100;s+=i,i++);

        用这种方式计算1加到100的和,循环体可以省掉。

        ※逗号运算符的优先级是C语言中最低的,比=号还低。假设a=3,下面的逗号表达式:

          b=(a=2+5,a*2)

        会先算a=2+5,再算7*2,b的最终值是14,而不是3*2得6。

        ※逗号表达式出现在函数调用当中,很容易混淆,如:

          func(rec1,rec2+rec3,(rec4,rec5));

        该函数调用语句中实际上只有3个函数实参,(rec4,rec5)是个逗号表达式,取变量rec5的值作为实参,差别就在于这个括号。

        ※逗号是表达式,分号表示一条语句结束。

      赋值表达式    

          int a=1,b=2,c,d;

          if((c=a)<(d=b)){…}

          if语句中,c=a表达式得到的结果为1,d=b得到的结果为2,相当于比较1<2,条件成立,会执行花括号中的语句。

     

        ※表达式int a=b=c=1+2;的真实运算顺序如下:

          int a=(b=(c=(1+2)));

     

        ※赋值表达式也可出现在函数中,如: 

          printf(“%d\n”,(n=5));

      运算符结合性

        单目运算符(++,--,!取反,&取址,*取值,正负号)、条件运算符(在后面讲解)和=号(包括复合运算)结合性都是从右向左,其它运算符都是从左向右结合,如:

        a=-i++相当于a=-(i++);

        int a=b=c=1+2+3;

        先算1+2是因为=号的优先级比+号低,先算后面的c=1+2是因为=号的运算符结合性是从右向左。

      ++- -

        i++等价于i=i+1

        i--等价于i=i-1

        ++i表示i先自加1,再参与运算

        如:

          int i=2;

          printf(“%d\n”,++i);

        输出3,i的值为3,这条printf语句可以分解为:

          i=i+1;

          printf(“%d\n”,i);

        ※注意i++和i+1的区别。

          i++表示i先参与运算,再自加1

          printf(“%d\n”, i++);

          输出2,但是i的值为3,它可以分解为:

          printf(“%d\n”,i);

          i=i+1;

        ※++和--只能作用于变量,不能作用于常量或表达式,如3++或(a+b)--都视为非法操作。因为++和--都会产生新值,常量或表达式都无法存放这个新值。

        ※如果遇见a+++b,编译器会尽可能地从左到右组合运算符,把它变成(a++)+b,这和运算符结合性没并有什么关系。如果你忘记了这条法则,可以自己使用括号控制运算顺序。

        设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为____

    // 17-1++运算符.c
    #include <stdio.h>
    
    main()
    {
        int n, i;
        //n = i = 2, ++i, i++;     //这是一条语句
        //printf("%d,%d\n", i, n); // 结果是:i = 4    n = 2
        printf("%d\n",(n=i=2,++i,i++)); 
        //结果是 i = 3    n = i = 2 中 i= 2, 然后 ++i i = 2 + 1 = 3 , 最后 输出 i = 3  在执行 i = 3+1
    
    }

                      

    // 17-2运算公式.c
    
    #include <stdio.h>
    #include <math.h>
    main()
    {
        int x;
        double a, b, c;
        x = (-b + (sqrt((pow(b, 2) - 4 * a *c)))) / (2 * a);
    }
  • 相关阅读:
    c++模板类的使用,编译的问题
    js中对象深度拷贝的方法(浅拷贝)
    java8 Function 函数式接口的妙用
    Redis Web Ui管理工具
    前端省市联动,与django传递信息
    做人做事,行为规范
    几斤猫尿,醉享生活
    分布式系统之平台三大支柱
    祭奠十年,我今起步
    一步一步,从一而终
  • 原文地址:https://www.cnblogs.com/httpcc/p/15448769.html
Copyright © 2011-2022 走看看