表达式与运算符

    技术2025-03-23  19

    一、什么是表达式?     表达式就是表达某种意思的式子。     在C语言中,表达式用运算符连接操作数的式子。     广义上讲,有;的就是语句,没有分号的就是表达式。      二、C语言中的运算符:     (1)算术运算符:  双目运算符(需要连接两个操作数),结合性:左->右         * /  %  +  -     ★注意整数/整数,其结果还是整数,若想要结果为实数,可在分子*1.0     隐式类型转换:不同数据类型之间进行运算时,其结果会转化为精度高的那个数据类型。         (无符号和有符号进行计算,结果为无符号)      %:取余运算符,在C语言中,要求两个操作数都必须为整数         5%3   2%3   -5%2   5%-2   -5%-2              (2)关系运算符: 双目运算符,左->右,表达两个式子的关系         >  >=  <  <=         ==  !=            由关系运算符连接操作数组成的表达式,叫做关系表达式        关系表达式的值:  1(关系成立)      0(关系不成立)            5>4>3        ==> 1>3        ==> 0             (3)逻辑运算符:  表达某数理逻辑的表达式         逻辑表达式的值:  真(非0)    假(0)         ★任何非0的数都表示真,但是如果表达式的结果为真时,只能是1                  !  (逻辑非),单目运算符,取逻辑上的反             !!(-1)  ==> 1         && (逻辑与),双目运算符,"并且",结合性 左->右             a && b && c         || (逻辑或),双目运算符,"或", 结合性 左->右                  ★在C语言中,运算是"惰性运算"。如果事先知道了表达式的值,那么它就不会           去运算后面的式子啦。           eg:   a && b && c                 只有当a的值为真时,才有必要去判断b的值                 只有a和b的值都为真时,才有必要去判断c的值                                  a || b || c                 只有当a的值为假时,才有必要去判断b的值                 只有当a和b的值都为假时,才有必要去判断c的值                      (4)位运算:按bit位来进行位运算操作的运算符         ~  (按位取反):单目运算符                  &  (按位与): 双目运算符             1 & 1 ==> 1             1 & 0 ==> 0             0 & 0 ==> 0             0 & 1 ==> 0                  |  (按位或):  双目运算符             1 | 1 ==> 1             1 | 0 ==> 1             0 | 1 ==> 1             0 | 0 ==> 0                      ^  (按位异或): 双目运算符,相同为假,不同为真             1 ^ 1 ==> 0             1 ^ 0 ==> 1             0 ^ 1 ==> 1             0 ^ 0 ==> 0                      << (左移): 双目运算符,按bit位往左边移             eg:  int a = 2<<1;  //4                 把数值2按bit位往左边移1个bit位,                 高位消失,低位补0                          >> (右移): 双目运算符,按bit位往右边移             逻辑右移:  高位补0             算术右移:  高位补符号位             C语言标准中,没有规定右移是逻辑右移和算术右移,在不同的编译器和处理器中,             实现方法可能不一样。          (5)赋值运算符:  双目运算符, 右->左,优先级排倒数第二         =           eg:   a = 5+3;         赋值表达式的值为赋值符号左边的值,赋值运算符的左边(左操作数)必须为"可写的地址"             5 = 3;//error                      复合的赋值运算符:赋值运算符可以和算术运算符、位运算符组成复合的赋值运算符         += :    a += 5  ==>  a = a+5         -=        &=         *=        |=         /=        ^=         %=        <<=         ~=        >>=              (6) 条件运算符  ? :     三目运算符    右->左             表达式1 ? 表达式2 : 表达式3         求值顺序:  先计算表达式1的值,如果表达式1的值为真,则整个条件表达式的值为表达式2的值,                    如果表达式1的值为假,则整个条件表达式的值为表达式3的值         eg:  printf("the max is %d\n",a>b?a:b);                 注意:条件表达式也有惰性运算              (7) 逗号运算符:  双目运算符,优先级最低的,  左->右             表达式1 , 表达式2         求值顺序: 先求表达式1的值,再求表达式2的值,整个逗号表达式的值为表达式2的值                  逗号表达式的扩展             表达式1,表达式2,表达式3,...表达式n         求值顺序:  先求表达式1,再求表达式2,...最后求表达式n的值,                    整个逗号表达式的值为表达式n的值         注意:  逗号表达式要与参数列表进行区分              (8)☆指针运算符(* , &)          (9)求字节运算符(sizeof)         求字节运算符的结果只跟圆括号内是什么数据类型有关,单位为字节             sizeof(1.0)  == sizeof(double)             sizeof(1.0f) == sizeof(float)             sizeof(2l)    == sizeof(long)             sizeof(2u)   == sizeof(unsigned int)             short s;             sizeof(s+1)  == sizeof(int)                  (10)☆分量运算符 (.  ->)         用于求结构体变量的成员变量             a.i;             p->i;//p是结构体指针                  (11)☆下标运算符 ( [] )        取数组中的元素        int a[10];        a[3]  a[4]             (12)强制类型转换运算符         (数据类型)         eg:  float a=3.6;              printf("%d\n",(int)a);                   (13)自增、自减运算符(++,--): 单目运算符                 表达式的值        执行完这个表达式后i的值         i++         i                   i+1         ++i         i+1                 i+1         i--         i                   i-1         --i         i-1                 i-1                             注意:(1)要避免 i=i++ 这种用法               (2)要避免在避免在一个表达式里对一个变量重复用++,可能会被编译器优化                 int i=2;                 (++i)+(++i)+(++i)                  运算符的优先级和结合性     () [] -> .             自左向右     ! ~ ++ --  +-(正负号)  自右向左       单目运算符     *  /  %                自左向右       算术运算符     +  -         <  <=  >  >=           自左向右       关系运算符     ==  !=     & ^ |  << >>           自左向右       位运算符     &&                     自左向右       逻辑运算符     ||     ? :                    自右向左       条件运算符     = += -= *= /=     %= &= |= ^= <<= >>=    自右向左       赋值运算符     ,                      自左向右       逗号运算符          同级优先级的运算符,实际优先级为左侧优先

    Processed: 0.013, SQL: 9