1、操作符简介
1)算术操作符:+ - * / %
2)移位操作符:>> <<
3)位操作符:& ^ |
4)赋值操作符:= += -= *= /= &= ^= |= >>= <<=
5)单目操作符(只有一个操作数)
单目操作符 | 含义 |
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
6)关系操作符
关系操作符 | 含义 |
> |
|
>= |
|
< |
|
<= |
|
!= | 用于测试“不相等” |
== | 用于测试“相等” |
7)逻辑操作符:逻辑与&&、逻辑或||、逻辑非!
8)三目运算符(条件操作符):exp1 ? exp2 : exp3
9)逗号表达式:exp1, exp2, exp3, …expN
10)下标引用、函数调用和结构成员:[] () . ->
注意:
一个等号“=”是赋值操作符。两个等号“==”是关系操作符,用于测试“相等”.
2、详细介绍
1)算数操作符
除法运算中注意
如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2。而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000。
取余运算中注意
取余运算只适合用两个整数进行取余运算,如:10%3 = 1;而10.0%3则是错误的。运算后的符号取决于被模数的符号,如(-10)%3 = -1;而10%(-3) = 1;
%%表示这里就是一个%符。
注意
①、C语言中没有乘方这个运算符,也不能用×,÷等算术符号。
②、除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
③、对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
④、% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2)<< 左移操作符、>> 右移操作符
移位操作符的操作数只能是整数。
①、左移操作符,移位规则:左边抛弃、右边补0。
②、 右移操作符,右移运算分两种
-
逻辑移位:左边用0填充,右边丢弃
算术移位:左边用原该值的符号位填充,右边丢弃
注意:对于移位运算符,不要移动负数位,这个是标准未定义的。
3)位操作符
& 按位与:按位与,同时为1则为1,有一个0则为0
| 按位或:按位或,同时为0则为0,有一个1则为1
^ 按位异或:按位异或,对应的二进制相同为0,相异为1
注意:他们的操作数必须是整数
4)自增与自减运算符
自增运算符++,使变量的值自增1。自减运算符--,使变量值自减1。自赠与自减运算符经常使用在循环中。
自增自减运算符有以下几种形式:
5)赋值运算符和复合赋值运算符
C语言中赋值运算符分为简单赋值运算符和复合赋值运算符,复合赋值运算符就是在简单赋值符=之前加上其它运算符构成。
简单赋值运算符:=
复合赋值运算符:+=、-=、*=、/=、%=
定义整型变量a并赋值为3,a += 5;这个算式就等价于a = a+5; 将变量a和5相加之后再赋值给a。
注意:复合运算符中运算符和等号之间是不存在空格的。
6)关系运算符
关系表达式的值是真和假,在C程序用整数1和0表示。
注意
①、>=, <=, ==, !=这种符号之间不能存在空格。
②、一个等号“=”是赋值操作符。
③、两个等号“==”是关系操作符,用于测试“相等”
7)逻辑运算符
逻辑运算的值也是有两种分别为真和假,C语言中用整型的1和0来表示。
其求值规则如下:
①、与运算 &&。参与运算的两个变量都为真时,结果才为真,否则为假。例如:5>=5 && 7>5,运算结果为真
②、或运算 ||。参与运算的两个变量只要有一个为真,结果就为真。两个量都为假时,结果为假。例如:5>=5||5>8,运算结果为真
③、非运算!。参与运算的变量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>8),运算结果为真
8)三目运算符
C语言中的三目运算符:?:,其格式为:表达式1 ? 表达式2 : 表达式3;
执行过程是:先判断表达式1的值是否为真,如果是真的话执行表达式2;如果是假的话执行表达式3。
#include <stdio.h>
int main()
{
double money = 12.0;
double cost = 11.5;
printf("小王能不能打车回家:");
printf("%c\n",money>=cost?'y':'n');
return 0;
}
9)逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10)下标引用、函数调用和结构成员
[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
例:
用结构体描述学生
int float 都是数据类型
struct Stu 是学生的类型
类型是用来创建变量的,此处创建了一个结构体类型,类型名struct Stu
struct Stu
{
//成员变量
char name[20];
int age;
char id[20];
};
//用结构体描述学生
//int float 都是数据类型
//struct Stu 是学生的类型
//类型是用来创建变量的。例 int a = 1;
//使用struct Stu这个类型创建了一个学生对象s1,并初始化。
struct Stu s1 = { "张三",18,"20001001" };
//结构体变量.成员名
printf("%s\n", s1.name);
printf("%d\n", s1.age);
printf("%s\n", s1.id);
struct Stu* ps = &s1;//地址,放到指针变量中,指针类型是 元素类型*
printf("%s\n", (*ps).name);//(*ps) 解引用操作,获得地址里面的内容
printf("%d\n", (*ps).age);
printf("%s\n", (*ps).id);
//结构体指针->成员名
printf("%s\n", ps->name);
printf("%d\n", ps->age);
printf("%s\n", ps->id);
3、运算符大比拼之优先级比较
各种运算符号的顺序
优先级别为1的优先级最高,优先级别为10的优先级别最低。
复杂表达式的求值有三个影响的因素。
1)操作符的优先级
2)操作符的结合性
3)是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。