2018网站开发,福州外网站建设,福建建设厅安全员报名网站,优衣库网站建设目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性#xff1a;优先级… 目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性优先级、结合性1.优先级2.结合性 五、表达式求值1.整型提升2.算术转换 一、逗号表达式
exp1, exp2, exp3, …expN逗号表达式就是用逗号隔开的多个表达式。 逗号表达式从左向右依次执行整个表达式的结果是最后⼀个表达式的结果。
//代码1
int a 1;
int b 2;
int c (ab, ab10, a, ba1); //逗号表达式
c是多少聪明的你此时心里一定已经有答案了趴没错就是13。
二、下标访问[ ]、函数调用()
1. [ ]下标引用操作符
操作数一个数组名 一个索引值
int arr[10]; //创建数组
arr[9] 10; //使⽤下标引⽤操作符。
[ ]的两个操作数是arr和9。2.函数调用操作符
接受一个或者多个操作数第一个操作数是函数名剩余的操作数就是传递给函数的参数。
#include stdio.h
void test1()
{printf(hehe\n);
}
void test2(const char *str)
{printf(%s\n, str);
}
int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2(hello bit.); //这⾥的()就是函数调⽤操作符。return 0;
}三、结构成员访问操作符
1.结构体
C语言已经提供了内置类型如char、short、int、long、float、double等但是只有这些内置类型还是不够的假设我想描述学生描述一本书这时单一的内置类型是不行的。描述一个学生需要名字、年龄、学号、身高、体重等描述一本书需要作者、出版社、定价等。C语言为了解决这个问题增加了结构体这种自定义的数据类型让程序员可以自己创造适合的类型。 结构是一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量如标量、数组、指针甚至是其他结构体。 (1) 结构的声明
struct tag
{
member-list;
}variable-list;描述一个学生
struct Stu
{char name[20]; //名字int age; //年龄char sex[5]; //性别char id[20]; //学号
}; //分号不能丢(2) 结构体变量的定义和初始化
//代码1变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2//代码2:初始化。
struct Point p3 {10, 20};
struct Stu //类型声明
{char name[15]; //名字int age; //年龄
};struct Stu s1 {zhangsan, 20}; //初始化
struct Stu s2 {.age20, .namelisi}; //指定顺序初始化//代码3
struct Node
{int data;struct Point p;struct Node* next;
}n1 {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 {20, {5, 6}, NULL}; //结构体嵌套初始化2.结构成员访问操作符
(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;
}使用方式 结构体指针-成员名 综合举例
#include stdio.h
#include string.hstruct Stu
{char name[15]; //名字int age; //年龄
};void print_stu(struct Stu s)
{printf(%s %d\n, s.name, s.age);
}void set_stu(struct Stu* ps)
{strcpy(ps-name, 李四);ps-age 28;
}int main()
{struct Stu s { 张三, 20 };print_stu(s);set_stu(s);print_stu(s);return 0;
}四、操作符的属性优先级、结合性
C语言的操作符有2个重要的属性优先级、结合性这两个属性决定了表达式求值的计算顺序。
1.优先级
优先级指的是如果一个表达式包含多个运算符哪个运算符应该优先执行。各种运算符的优先级是不⼀样的。
3 4 * 5; 上面示例中表达式 3 4 * 5 里面既有加法运算符 又有乘法运算符 * 。由于乘法的优先级高于加法所以会先计算 4 * 5 而不是先计算 3 4 。
2.结合性
如果两个运算符优先级相同优先级没办法确定先计算哪个了这时候就看结合性了则根据运算符是左结合还是右结合决定执行顺序。大部分运算符是左结合从左到右执⾏少数运算符是右结合从右到左执行比如赋值运算符 。
5 * 6 / 2; 上面示例中 * 和 / 的优先级相同它们都是左结合运算符所以从左到右执行先计算 5 * 6 再计算 6 / 2 。 运算符的优先级顺序很多下面是部分运算符的优先级顺序按照优先级从高到低排列建议大概记住这些操作符的优先级就行其他操作符在使用的时候查看下面链接就可以了。 圆括号 () ⾃增运算符 ⾃减运算符 -- 单⽬运算符 和 - 乘法 * 除法 / 加法 减法 - 关系运算符 、 等赋值运算符 由于圆括号的优先级最高可以使用它改变其他运算符的优先级。 这里是所有的C运算符优先级表https://zh.cppreference.com/w/c/language/operator_precedence
五、表达式求值
1.整型提升
C语言中整型算术运算总是至少以整型类型的精度来进行的。 为了获得这个精度表达式中的字符和短整型操作数在使⽤之前被转换为普通整型这种转换称为整型提升。 整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度同时也是CPU的通用寄存器的长度。 因此即使两个char类型的相加在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPUgeneral-purposeCPU是难以直接实现两个8比特字节直接相加运算虽然机器指令中可能有这种字节相加指令。所以表达式中各种长度可能小于int长度的整型值都必须先转换为int或unsigned int然后才能送入CPU去执行运算。 //实例1
char a,b,c;
...
a b c;b和c的值被提升为普通整型然后再执行加法运算。 加法运算完成之后结果将被截断然后再存储于a中。 如何进行整体提升呢 1.有符号整数提升是按照变量的数据类型的符号位来提升的 2.⽆符号整数提升高位补0 //负数的整形提升
char c1 -1;
变量c1的⼆进制位(补码)中只有8个⽐特位
1111111
因为 char 为有符号的 char
所以整形提升的时候⾼位补充符号位即为1
提升之后的结果是
11111111111111111111111111111111//正数的整形提升
char c2 1;
变量c2的⼆进制位(补码)中只有8个⽐特位
00000001
因为 char 为有符号的 char
所以整形提升的时候⾼位补充符号位即为0
提升之后的结果是
000000000000000000000000000000012.算术转换
如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数转换为另⼀个操作数的类型否则操作就无法进行。下⾯的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int如果某个操作数的类型在上面这个列表中排名靠后那么首先要转换为另外一个操作数的类型后执行运算。 总结 即使有了操作符的优先级和结合性我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径那这个表达式就是存在潜在风险的建议不要写出特别复杂的表达式。 操作符详解就此完结感谢各位的支持和点赞下期见哟