-
运算符
什么是运算符?
用来进行运算的符号。如:
+ - * / % …a、几目运算符? 该运算符需要几个操作数。
单目运算符 :该运算符需要1个操作数. 如: ++ –
双目运算符 :该运算符需要2个操作数
三目运算符 :该运算符需要3个操作数 如: ? :b、结合性 : 决定先算谁后算谁的问题
从左至右的结合性 , 从右至左的结合性如: + 结合性 : 从左至右结合 a + b 先算表达式a的值,再算表达式b的值 , 最后把 a+b so,在C语言中: a + b 与 b + a 的含义一样? 不一样 例子: i = 5, j = 6; (i++) + (i+j) == 17? (i+j) + (i++) == 16 ?
c、优先级 : 在一个含有多个运算符的表达式中,先算哪一个运算符。
单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符
(1) 算术运算符: 进行算数运算的运算符。
++ -- :单目运算符 + - * / % : 双目运算符 ,结合性从左至右。 例子: 3 + 5 == ? 8 5 / 4 == ? 1 (整数进行算数运算结果为整数) 5.0 / 4 == ? 1.25 (结果向高精度转换) typeof(5/4) == ? int typeof(5.0/4) == ? double 3 / 2 == ? 1 (double)(3 / 2) == ? 1.0 (double) 3 / 2 == ? 1.5 问题: 用C语言的表达式方式来描述数学里面的式子。 a / b 描述: (double)a/b 1.0 * a / b % : 求余,取模。 要求两个操作数必须为整数。 5 % 4 == ? 1 5 % 4.0 == ? ERROR 5.0 % 4 == ? ERROR 4 % 5 == ? 4 ++ : 自增运算符 i++ ++i -- : 自减运算符 i-- --i ++ -- :单目运算符,要求操作数必须为一个 "左值" 左值: lvalue 可写的地址 例子: int a = 1024; 5++ ERROR (a+b)++ ERROR (a++)++ ERROR a++ OBJK 表达式的值 做完表达式之后i的值 i++ i i = i + 1 ++i i + 1 i = i + 1 i-- i i = i - 1 --i i - 1 i = i - 1 例子: i = 5; a = i++; printf("i == %d\n", i); //6 printf("a == %d\n", a); //5 i = 5; a = ++i; printf("i == %d\n", i); //6 printf("a == %d\n", a); //6 i = 5; a = i--; printf("i == %d\n", i); //4 printf("a == %d\n", a); //5 i = 5; a = --i; printf("i == %d\n", i); //4 printf("a == %d\n", a); //4 i = 5; (i++) + (i++) + (i++) 拒绝做此类题目,因为这种题目没有任何意义!
(2) 关系运算符 : 用来判断两个东东关系的运算符。
“关系” : 数值大小关系> < >= <= == != 双目运算符,结合性从左至右。 关系表达式;用关系运算符连接起来的式子。 关系表达式的值 : 关系成立 1 关系不成立 0 例子: 5 > 4 => 1 3 <= 2 => 0 5 > 4 > 3 => 这是一个合法的表达式。 <=> (5 > 4) > 3 <=> 5 > 4 => 1 1 > 3 => 0 so,在C语言中 , 5 > 4 > 3 这个表达式的含义和数学上的含义 是不一样的。 在C语言中, 5 > 4 > 3 是拿表达式(5 > 4)的值 与 3 进行PK. 在数学上的含义: 5 > 4 并且 4 > 3 如何描述数学上的含义?
(3) 逻辑运算符 : 用来描述逻辑关系的运算符。
! 逻辑非 单目运算符 “取反” 真变假 假变真 && 逻辑与 双目运算符 “并且” 从左至右结合性 只要有一个操作数为假,那么值就为假 || 逻辑或 双目运算符 “或者” 从左至右结合性 只要有一个操作数为真,那么值就为真 逻辑表达式 : 逻辑运算符连接起来的式子。 逻辑表达式的值: 逻辑真 (非0 ,1) 逻辑假 ( 0 ) 例子: a = 4 , b = 5 a && b => 1 a && 0 => 0 a || 0 => 1 !a || b => 1 a && 0 || 2 => 1 5 > 3 && 8 < 4 - !0 => 0
练习:
int a, b , c , d , m ,n;
a = 1;
b = 2;
c = 3;
d = 4;
m = 1;
n = 1;
(m = a > b) && (n = c > d);
printf("%d %d %d %d %d %d\n", a,b, c, d, m , n);
#include <stdio.h>
int main()
{
int a, b , c , d , m ,n;
a = 1;
b = 2;
c = 3;
d = 4;
m = 1;
n = 1;
(m = a > b) && (n = c > d);
printf("%d %d %d %d %d %d\n", a,b, c, d, m , n); // 1 2 3 4 0 1
}
C语言的运算符的惰性运算:
(1) a && b && c
只有a为真时,才需要去判断b的值
只有a和b都为真的时候,才需要去判断c的值。
(2) a || b || c
只要a为真,就不需要判断b和 c的值
只有a为假时,才需要去判断b的值
只有a和b都为假的时候,才需