运算符 | 含义 | 优先级 | 举例 | 说明 |
---|---|---|---|---|
! | 逻辑反 | 高 | !a | 如果 a 为真,则 !a 为假;如果 a 为假,则 !a 为真。 |
&& | 逻辑与 | 中 | a && b | 只有 a 和 b 同时为真,结果才为真;a 和 b 只要有一个是假的,则结果为假。 |
|| | 逻辑或 | 低 | a || b | 只要 a 或 b 中有一个为真,则结果为真;a 和 b 同时为假,结果采薇假。 |
1. “ ! ” 逻辑反
2. “ && ” 逻辑与
3. “ || ” 逻辑或
先说结论
举个栗子
#include
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}~~删除线格式~~
再看个栗子
#include
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
表达式1 ? 表达式2 : 表达式3;
表达式 1 是条件表达式,如果结果为真,则返回表达式 2;如果为假,则返回表达式 3。
例如:求两个数中得较大值。
if(a > b)
{
max = a;
}
else
{
max = b;
}
max = a > b ? a : b;
//a > b 吗?,大于则返回 a,否则返回 b
语法格式
表达式1, 表达式2, 表达式3, …,表达式N
逗号表达式的运算过程
举个栗子
再举个栗子
a = (b = 3, (c = b + 4) + 5)
逗号表达式注意事项
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
接收一个或者多个操作数
//函数定义
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
//函数调用
int c = Add(a, b);//这里的小括号 () 就是函数调用操作符
// () 的操作数为:Add,a,b
return 0;
}
操作符 | 语法格式 |
---|---|
. | 结构体 . 成员名 |
-> | 结构体指针 -> 成员名 |
** 1. “ . ” 操作符**
#include
//创建结构体类型
struct student
{
char name[10];
int age;
};
int main()
{
//根据定义的结构体类型创建结构体变量并初始化
struct student s1 = { "张三",18 };
//访问结构体成员(结构体变量 . 成员变量)
printf("名字:%s 年龄:%d\n", s1.name, s1.age);
return 0;
}
2. “ -> ” 操作符
#include
//创建结构体
struct student
{
char name[10];
int age;
};
int main()
{
struct student s2 = { "张三",18 };
//创建结构体指针变量 让其指向s2
struct student* ps = &s2;
// 用结构体指针访问成员(->)
printf("名字:%s 年龄:%d\n", ps->name, ps->age);
return 0;
}
表达式的定义
- 1 + 1
- 'a' + 'b'
- a + b
- a + 'b' + pow(a,b) * 3 / 4 + 5
表达式的求值顺序
整型提升的意义
为啥下面代码的结果会是 -125?
如何进行整型提升?
整形提升是按照变量的数据类型的符号位来提升的
char c1 = -1;//-1 是整数,32 个比特位
- -1 的补码是 1111 1111 1111 1111 1111 1111 1111 1111
- 将结果往 c1 存的时候因为 c1 是 char 放不下这么多比特位,于是就发生了截断
- 将最后 8 个比特位截了下来放到变量 c1 里面去,c1 里存的是 1111 1111
- 现在要对 c1 进行整型提升,c1 的类型是 char ,意味着 c1 是个有符号 char,
- 所以会将在 c1 中存储的二进制序列 1111 1111 里最高位的那个 1 解读为符号位
- 符号位是 1 表示它是负数,对 c1 进行整型提升就会在高位补原符号位的 1
- 提升之后的结果为 1111 1111 1111 1111 1111 1111 1111 1111 1111
char c2 = 1;
- 变量c2的二进制位(补码)中只有8个比特位:0000 0001
- 因为 char 为有符号的 char,最高位又是个 0
- 所以整形提升的时候,高位补充符号位,即为 0
- 提升之后的结果是:0000 0000 0000 0000 0000 0000 0000 0001
解析之前的代码
- 将 5 的二进制补码最后 8 位截断,然后赋给 a;
- a 里存放的补码为 0000 0101
- 将 126 的二进制补码最后 8 截断,然后赋给 b;
- b 里存放的补码为 0111 1110
- 现在要将 a 和 b 里存的补码进行相加,但是 a 和 b 达不到整型,所以进行整型提升
- a 符号位为 0,整型提升高位补 0,结果为 0000 0000 0000 0000 0000 0000 0000 0101
- b 符号为为 0,整型提升高位补 0,结果为 0000 0000 0000 0000 0000 0000 0111 1110
- 现再将 a 和 b 提升后的结果相加,结果为 0000 0000 0000 0000 0000 0000 1000 0011
- 将结果赋给 c,c 是 char 存不下这么多比特位,进行截断,将 1000 0011 赋给 c
- 因为要打印 c,所以对 c 进行整型提升,符号位为 1,高位补 1
- c 的补码为 1111 1111 1111 1111 1111 1111 1000 0011
- 将结果转成原码然后进行打印;
- c 的原码为 1000 0000 0000 0000 0000 0000 0111 1101
整型提升的例子
//实例1
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (0xb6 == a)
{
printf("a");
}
if (0xb600 == b)
{
printf("b");
}
if (0xb6000000 == c)
{
printf("c");
}
return 0;
}
c
//实例2
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
算术转换定义
- long double
- double
- float
- unsigned long int
- long int
- unsigned int
- int
合理进行算术转换
float f = 3.14;
int num = f;//隐式转换,会有精度丢失
复杂表达式的求值有三个影响的因素
运算符的优先级和结合性表