一 单⽬操作符
1 分类
1.2 !
作用:取反运算符
例如如果flong表示真则!flong表示假。
1.3 + -
这里的“+”是正号“-”表示负号。
’+‘对于正负值并没有影响;当然如果你想打印一个数字前面要显示正号这时候就可以使用’+‘;
’-‘用来改变一个值的正负 ,负数前面加上’-‘会得到正数,正数前面加上’-‘会得到负数。
1.4 sizeof
作用:用于求取各种类型变量的长度。
1.5 (类型)
(类型)表示强制类型转换。
注意将3.14强制转换为整型编译器会自动省去小数点后的1数。
二 逗号表达式
语法:逗号表达式,就是⽤逗号隔开的多个表达式。
1 exp1, exp2, exp3, …expN
过程:逗号表达式,从左向右依次执⾏计算。整个表达式的结果是最后⼀个表达式的结果。
三 下标访问[]、函数调⽤()
1 下标访问[]
常见于数组中
1 int arr[ 10 ]; // 创建数组2 arr[ 9 ] = 10 ; // 实⽤下标引⽤操作符。3 [ ] 的两个操作数是 arr 和 9 。
2 函数调⽤()
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>int Add(int x,int y)
{
return x+y;
}int main()
{
//这里的()就是作为函数调用操作符
printf("hello worad");/2个操作数
Add(3,5)//3个操作数
return 0;
}
四 结构成员访问操作符
1 结构体
1.1定义
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。
那为什么会有结构体呢?
1.2 结构的声明
struct tag{member- list ;}variable- list ;
例如描述⼀个学⽣:
struct Stu{char name[ 20 ]; // 名字int age; // 年龄char sex[ 5 ]; // 性别char id[ 20 ]; // 学号}; // 分号不能丢
1.3 结构体变量的定义和初始化
变量的定义
struct Point{int x;int y;}p1; // 声明类型的同时定义变量 p1 (p1是全局变量)struct Point p2 ; //定义结构体变量p2(p1是全局变量)
变量的初始化
(1) 初始化和指定顺序初始化
struct Point p3 = { 10 , 20 };struct Stu // 类型声明{char name[ 15 ]; // 名字int age; // 年龄};struct Stu s1 = { "zhangsan" , 20 } ;//初始化 (要与 struct Stu中局部变量的顺序一一对应)struct Stu s2 = {.age= 20 , .name= "lisi" }; //指定顺序初始化(可以无顺序)
(2)结构体嵌套初始化
struct Node{int data;struct Point p ;struct Node * next ;}n1 = { 10 , { 4 , 5 }, NULL }; //结构体嵌套初始化struct Node n2 = { 20 , { 5 , 6 }, NULL }; / /结构体嵌套初始化
1.4 结构成员访问操作符
(1) 结构体成员的直接访问
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。使⽤⽅式:结构体变量.成员名。
例如
# include <stdio.h>struct Point{int x;int y;}p = { 1 , 2 };int main (){printf ( "x: %d y: %d\n" , p.x, p.y);return 0 ;}
(2) 结构体成员的间接访问
有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。使⽤⽅式:结构体指针->成员名。
例如
# include <stdio.h>struct Point{int x;int y;};int main (){struct Point p = { 3 , 4 };struct Point * ptr = &p;ptr->x = 10 ;ptr->y = 20 ;printf ( "x = %d y = %d\n" , ptr->x, ptr->y);return 0 ;}
五 操作符的属性:优先级、结合性
作用:2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。
1 优先级
定义:优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的。
例如
3 + 4 * 5 ;
2 结合性
定义:如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符(=)。
例如
5 * 6 / 2 ;
参考:https://zh.cppreference.com/w/c/language/operator_precedence
那有了操作符的属性:优先级、结合性,就能完全解决问题吗 ?答案是不能:
例如
a*b + c*d + e*f
c + --c;
六 表达式求值
1 整型提升
2 整型提升的意义:
3 如何进⾏整体提升呢?
1 . 有符号整数提升是按照变量的数据类型的符号位来提升的2. ⽆符号整数提升,⾼位补0
//负数的整形提升char c1 = -1 ;变量 c1 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位:1111111因为 char 为有符号的 char所以整形提升的时候,⾼位补充符号位,即为 1提升之后的结果是:11111111111111111111111111111111//正数的整形提升char c2 = 1 ;变量 c2 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位:00000001因为 char 为有符号的 char所以整形提升的时候,⾼位补充符号位,即为 0提升之后的结果是:00000000000000000000000000000001//⽆符号整形提升,⾼位补0
4 算术转换
定义:如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。
下⾯的层次体系称为寻常算术转换。
1 long double2 double3 float4 unsigned long int5 long int6 unsigned int7 int
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
本篇文章就到此结束,希望有所能帮到 读者更好的了解操作符操作符操作符。