一、什么是表达式? 表达式就是表达某种意思的式子。 在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) 运算符的优先级和结合性 () [] -> . 自左向右 ! ~ ++ -- +-(正负号) 自右向左 单目运算符 * / % 自左向右 算术运算符 + - < <= > >= 自左向右 关系运算符 == != & ^ | << >> 自左向右 位运算符 && 自左向右 逻辑运算符 || ? : 自右向左 条件运算符 = += -= *= /= %= &= |= ^= <<= >>= 自右向左 赋值运算符 , 自左向右 逗号运算符 同级优先级的运算符,实际优先级为左侧优先