一、sizeof
使用sizeof 可以获取数据类型或变量、字面量的存储大小,单位是字节。
sizeof返回一个size_t类型的无符号整数值,格式占位符是 %zu。
size_t 通常是 unsigned int 或 unsigned long 的别名,具体是哪个类型的别名,由系统和编译器决定。
代码演示:
#include <stdio.h>
int main()
{
// sizeof:可以检查出 类型 占得内存大小->字节
printf("char=%zu\n", sizeof(char));
printf("short=%zu\n", sizeof(short));
printf("int=%zu\n", sizeof(int));
printf("long=%zu\n", sizeof(long));
printf("long long=%zu\n", sizeof(long long));
printf("float=%zu\n", sizeof(float));
printf("double=%zu\n", sizeof(double));
printf("long double=%zu\n", sizeof(long double));
// sizeof:可以检查出 变量 占得内存大小->字节
char ch = 'a';
int a = 12306;
double num = 3.14;
printf("a=%zu\n", sizeof(a));
// 检测对应变量的时候,小括号可以省略
printf("ch=%zu\n", sizeof ch);
printf("num=%zu\n", sizeof num);
// 检测字面量
// 字符本质即为整数=97->默认int类型
printf("字符a=%zu\n", sizeof 'a');
printf("小数6.6=%zu\n", sizeof 6.6);
// sizeof可以检测:类型 变量 字面量等占用的内存的大小
//char 占用一个字节 int 四字节 double 八字节
printf("%zu\n", sizeof(7 + 8));
return 0;
}
二、数据类型转换
1.自动隐式转换
(1)转换规则:
- 不同类型整数进行运算,窄类型整数自动转换为宽类型整数。
- 不同类型浮点数进行运算,精度小的类型自动转换为精度大的类型。
- 整数与浮点数进行运算,整数自动转换为浮点数。
(2)转换方向
(3)案例演示
《1》窄类型自动转为宽类型。
《2》不同类型浮点数进行运算,精度小的类型自动转换为精度大的类型。
《3》整数自动转换为浮点数。
《4》赋值时,类型自动转换。窄类型赋值给宽类型,等号右边的类型转变为左边的类型,不会造成精度损失。宽类型赋值给窄类型,则会精度损失。
2.强制类型转换
隐式类型转换中的宽类型赋值给窄类型,编译器是会产生警告的(有些编译器不会),提示程序存在潜在的隐患,如果非常明确地希望转换数据类型,就需要用到强制(或显式)类型转换。
转换格式:(类型名)变量、常量、表达式(比如7+8)
例子:(int)a,(int)3.14,(int)a+b
演示代码:
三、运算符
1.算术运算符
+、-、*、/、%对于变量本身的值没有影响。
++、--会对变量有影响。
++a,变量a在使用之前先加一;
a++,变量a在使用之后才加一。--也是如此。且使用后对变量的值有影响。
2.关系运算符
#include <stdio.h>
int main()
{
int a = 8;
int b = 7;
printf("a>b的值:%d \n", a > b);
printf("a>=b的值:%d \n", a >= b);
printf("a<b的值:%d \n", a < b);
printf("a<=b的值:%d \n", a <= b);
printf("a==b的值:%d \n", a == b);
printf("a!=b的值:%d \n", a != b);
return 0;;
}
输出结果:
a>b的值:1
a>=b的值:1
a<b的值:0
a<=b的值:0
a==b的值:0
a!=b的值:1
3.逻辑运算符
(1)逻辑与&&
- 如果两个操作数都为真(非零),那么表达式的值为真,否则为假。
- 如果第一个操作数为假,第二个操作数没有计算的必要了,这种现象称为短路现象。
类似于高中物理学的串联电路。
(2)逻辑或||
- 如果两个操作数都为真(非零),那么表达式的值为真,否则为假。
- 如果第一个操作数为假,第二个操作数没有计算的必要了,这种现象称为短路现象。
类似于高中物理学的并联电路。
(3)逻辑非!
操作数取反。
4.赋值运算符
a+=6 ==> a=a+6;
5.位运算符
PS:操作数进行位运算的时候,以它的补码形式进行运算。
6.三元运算符
基本语法: 条件表达式? 表达式1: 表达式2;
取值:
- 如果条件表达式为非0(真),整个表达式的值是表达式1;
- 如果条件表达式为0(假),整个表达式的值是表达式2;
#include <stdio.h>
// 三元运算符:条件?A:B;
int main()
{
// int num = 6;
// int num1 = 9;
// printf("三元运算:结果%d\n", 1 ? num : num1);
// printf("三元运算:结果计算出谁大:%d\n", num > num1 ? num : num1);
int a = 100;
int b = 200;
int c = 300;
int result = (a > b ? a : b) > c ? (a > b ? a : b) : c;
printf("%d\n", result);
return 0;
}
输出 300
7.运算符优先级
不需要记太多,开发过程不用表达的太复杂,分几步完成即可。先算乘除后算加减,有括号先算括号里。
四、程序控制语句
流程控制语句
单分支语句
if(condition)
{
······代码片段
}
五、课后练习
- 实现判断一个整数,属于哪个范围:大于0;小于0;等于0。
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a>=0)
{
if(a==0)
{
printf("这个数等于0.");
}
else
{
printf("这个数大于0.");
}
}
else
{
printf("这个数小于0.");
}
return 0;
}
2.判断年份是否闰年。
#include <stdio.h>
int main(){
int year,leap;
scanf("%d",&year);
if(year%4==0 && year%100!=0 || year%400==0)
printf("this year is 闰年");
else
printf("this year is 平年");
return 0;
}
六、今日小测
1.写出至少五个二元运算符。
2.写出下面程序运行成果。
int a = 5, b = 10, result;
result = (a > b) ? a : b;
printf("%d", result);
3.写出下面程序的执行结果。
int num = 8;
num = num << 2;
printf("%d", num);
4.
int num = 10;
if (num++ || num--)
{
num++;
}
printf("%d", ++num);
答案:
1.+、-、*、/、%、<、<=、>、>=、=、!=、&&、||、&、|、<<、>>、=、+=、-=
2. 10
3. 32
4. 13
解析:
- if (num++ || num--) { num++; }: 这是一个if语句它使用逻辑或运算符连接两个条件,num++ 表示使用当前值,然后将 num 的值递增,在这里,它增加了 num 到 11。
- 由于逻辑或运算符的短路特性,第一个条件为真(非零),则不会执行第二个条件,num -- 没有执行。
- if 的条件表达式最终是是成立的,代码块中的 num++ 会被执行,将 num 增加到12。
- printf("%d", ++num); ,++num 表示先将 num 的值递增,然后使用递增后的值。所以输出的结果是 13.