C语言的类型转换
- 自动类型转换
注意点
: 自动类型转换不会修改数据原有的值.- 运算转换/赋值转换
//运算转换
//注意点:编译器会把小类型的自动转换为大类型的
double res = 7.5 / 2;
printf("%lf\n", res);
//赋值转换
//注意点: 在赋值的时候会自动把等号右变的类型转换为等号左边的类型
int num = 3.14;
double num1 = 5;
printf("%i\n", num);
printf("%lf\n", num1);
- 强制类型转换
//强制类型转换
int num1 = 10;
double res = (double)num1;
printf("%lf\n", res);
赋值运算符
简单赋值运算符
// 1. 简单赋值运算符
// 将右边的值赋值给左边的变量
// 结合性: 右结合性
int num = 10;
int value = 20;
复杂赋值运算符号
// 2. 复杂赋值运算符
int num1 = 5;
num1 += 5; //num1 = num1 + 5
num1 -= 5;
num1 *= 5;
num1 /= 5;
num1 %= 5;
赋值运算符的结合性
/*
* 赋值运算符的结合性
* 右结合性
*
* 优先级: 赋值运算符的优先级低于算术运算符的优先级
*
*/
double value = 10.0;
value /= 5 + 3; // value = 10 / (5 + 3)
printf("%lf\n", value); //1.250000
int temp = 3 + 8;
printf("%i\n", temp);
变量自增自减
注意点: 自增或者自减只能对变量使用,不能用于常量和表达式,自增或者自减最好单独出现
/*
* 1. 自增作用: 快速+1
* 只要在变量的后面或者前面写上++,就代表给这个变量+1
*
* num++ 和 ++num 是有区别的:
* 第一种是先参与其他运算后自增,先用后变
* 第二种是先自增后参与其他运算,先变后用
*
*
* 2. 自减作作用: 快速-1
*
* 只要在变量的后面或者前面写上--,就代表给这个变量-1
*
* num-- 和 --num 是有区别的:
* 第一种是先参与其他运算后自增,先用后变
* 第二种是先自增后参与其他运算,先变后用
*
* 注意点: 自增或者自减只能对变量使用,不能用于常量和表达式
*
*/
int num = 5, res = 0;
res = 10 + num++;
printf("%i\n", res);
printf("%i\n", num);
res = 10 + ++num;
printf("%i\n", res);
printf("%i\n", num);
sizeof运算符
sizeof
/*
* sizeof运算符
* 格式:
* 第一种格式:
* sizeof(变量/常量/数据类型);
* 第二种格式
* sizeof 变量/常量
*
* 作用: 专门用于计算变量/常量/数据类型占用的存储空间大小,返回的是整型数字
*
*/
//计算变量
int value = 10; //4字节
double num = 5.2; //8字节
int res = sizeof(value);
int res2 = sizeof(num);
// printf("%i\n", res2);
//计算常量
int res3 = sizeof(5); //4字节
// printf("%i\n", res3);
//计算数据类型
int res4 = sizeof(char); //1字节
int res5 = sizeof(float);//4字节
printf("%i\n", res4);
printf("%i\n", res5);
sizeof 常用知识点
注意点:
sizeof是一个运算符,而不是一个函数,而且sizeof运算符的优先级高于算术运算符的优先级.
/*
* sizeof运算符常用的知识点
*
*/
//sizeof运算符的优先级高于算术运算符,所以会优先计算sizeof
int res = sizeof(3.15 + 1) + 3;
printf("%i\n", res); // 11
逗号运算符
注意点: 逗号是一个运算符,所有运算符都有结果,所以逗号运算符的结果是最后一个表达式的值
逗号运算符结合性: 左结合性
逗号运算符
//同时定义多个变量
int a, b;
//同时给多个变量赋值
a = 10, b = 20;
//常见的面试题,利用逗号的计算规则
int num1 = 10, num2 = 15, num3 = 20;
int res = ((num1 + num2), (num2 + num3));
printf("%i\n", res); //35
关系运算符
- 关系运算符: > >= < <= == !=, 返回值: 1(true) 或者 0(false)
注意点: c语言中非0即是真,所有非0的数都为true,只有0为false
- 关系运算符的结合性: 具有左结合性
注意点: 当优先级和结合性同时存在时,优先考虑优先级,结合性后考虑
- 关系运算符的优先级: > >= < <= 优先级高于 == !=
/*
* 关系运算符: > >= < <= == !=
*/
int res = 14 >= 12;
printf("%i\n", res);// 1
int num1 = 2, num2 = 6;
int res2 = num1 == num2;
printf("%i\n", res2);// 0
int num1 = 4, num2 = 8, num3 = 10;
// 0 == 10
int res = num1 >= num2 == num3; //0
printf("%i\n", res);
逻辑运算符
逻辑与 &&
- 格式: 表达式 && 表达式
- 返回值: 和关系运算符一样,返回结果0(false) 或者 1(true)
- 规则:
一假则假
,其中有一个假的则结果为假,全部为真结果才为真
注意点:逻辑短路,即如果第一个表达式为假,则全部为假就不会计算第二个表达式
//逻辑&& 一假则假
int num1 = 10, num2 = 20;
//第一个表达式为假,则不会继续计算第二个表达式
int res = num1 > 20 && num2++ > 30; //0
printf("%i\n", res);
printf("%i\n", num2);
逻辑与 ||
- 格式: 表达式 || 表达式
- 返回值: 和关系运算符一样,返回结果0(false) 或者 1(true)
- 规则:
一真则真
,其中有一个真的则结果为真,全部为假则结果才为假1
注意点:同逻辑与一样,也有逻辑短路,如果第一个表达式为真,则不会继续计算第二个表达式,返回结果为真
//逻辑||
int num1 = 15, num2 = 30;
//一真则真,如果第一个表达式为真,则无论第二个表达式是否为真,都不会去计算
int res = 15 > 10 || num2++ < 3; //1
printf("%i\n", res);
printf("%i\n", num2);
逻辑与 !
- 格式: !表达式
- 返回值: 和关系运算符一样,返回结果0(false) 或者 1(true)
- 特点: 可以连续书写非逻辑
- 规则: 真既是假, 假既是真
//逻辑!
int res = !!!!(5>100);
printf("%i\n", res); //0
三目运算符
- 格式: 表达式 ? 结果1 : 结果2
- 返回值: 如果表达式为真,则返回结果1,如果不成立则返回结果2
注意点: 三目运算中的? :不能分开使用,而且三目运算符的优先级低于算术运算符的优先级
/*
* 三目运算符号
注意点: 结果1 和结果2如果放的是函数,则该函数必须要有返回值
*/
int num1 = 30, num2 = 20;
//表达式成立,则返回true,不成立则返回false
int res = num1 > num2 ? printf("true") : printf("false"); //true
//由于三目运算符的优先级低于算术运算符,所有会先进行计算判断
int res2 = 10 + 5 < 20 + 30 ? printf("1\n") : printf("0\n"); //1