C语言的本质:操作内存
内存:读写速度快、数据掉电丢失
硬件:读写速度慢、数据掉电不丢失
内存分配的最小单位:字节 Byte
数据类型
基本类型 | 整形、浮点型、枚举类型 |
构造类型 | 数组、结构体、共用体 |
指针类型 | int*、char* ... |
空类型 | void |
整数类型
有符号(signed)
无符号(unsigned)
备注:不写有无符号时,默认为有符号。有符号数的最高位为符号位(1为负数 0为正数),其他位叫数据位
占用内存空间 | 存储数据的范围 | |||
---|---|---|---|---|
整数类型 | char | 字符类型 | 1 | 无符号:[0,2^8-1] 有符号:[-2^7,2^7-1] |
short | 短整型 | 2 | 无符号:[0,2^16-1] 有符号:[-2^15,2^15-1] | |
int | 整形 | 4 | 无符号:[0,2^32-1] 有符号:[-2^31,2^31-1] | |
long | 长整型 | 4 | 在32位系统中和int一样 4Byte 在64位系统中和long long一样8Byte | |
long long | 长长整型 | 8 | 无符号:[0,2^64-1] 有符号:[-2^64,2^63-1] | |
浮点数类型 | 4 | |||
空类型 | 8 |
常量
类型 | 前缀 | 输出占位符 | 例子 | |
---|---|---|---|---|
整型常量 | 二进制 | 0b | 无 | 0b1010 |
八进制 | 0 | %#o | 0576 | |
十进制 | 无 | %d %ld %lld %hd | 520 | |
十六进制 | 0x | %#x | 0xAB12 | |
浮点型常量 | float 单精度浮点型 | %f | 3.14 | |
double 双精度浮点型 | %lf | 5.26 | ||
指数常量 | %e | 科学计数法 | ||
字符常量 | %c | 'A' | ||
字符串常量 | %s | "beijing" | ||
标识常量 | 宏定义 #define |
变量
格式:存储类型 数据类型 变量名;
存储类型:const static extren register volatile auto (局部变量不写存储类型时,默认是 duto)
数据类型:定义变量占用多大的内存空间
数据类型:是一个标识符,要符合标识的命名规范
强制类型转换
强转只是在本次运算中使用其他类型参与运算,不影响变量原来的类型
显示强转
格式 :(新的类型)变量名
隐式强转
运算符
算数运算符 | + - * / %(模除 取余) | |
---|---|---|
自增自减运算符 | ++ -- | |
关系运算符 | < > <= >= == != | |
逻辑运算符 | && || ! | |
位运算符 | & | ^ ~ << >> | |
赋值运算符 | = += -= *= != | |
条件运算符 | ?: (c语言唯一的三目运算符) | |
sizeof运算符 | 用来计算变量或者类型占用内存空间的大小 | |
逗号运算符 | , |
算数运算符
在终端获取用户输入的三位整数,输出这个数的百位、十位、个位之和
#include<stdio.h>
int main(int argc, const char *argv[])
{
int num = 0;
int ge = 0;
int shi = 0;
int bai = 0;
printf("请输入一个三位数:");
scanf("%d",&num);
bai = num / 100;
shi = (num % 100) / 10;
ge = num % 10;
printf("数字之和是:%d\n",ge+shi+bai);
return 0;
}
自增自减运算符
以下方代码为例:不论是a++还是++a,a的值都会自增,但表达式结果不一样
b = ++a的值会增加1
b = a++的值不变
#include<stdio.h>
int main(int argc, const char *argv[])
{
int a = 0;
int b = 0;
a = 10;
b = 0;
b = ++a;
printf("a = %d b = %d\n",a,b); // a=11 b=11
a = 10;
b = 0;
b = a++;
printf("a = %d b = %d\n",a,b); // a=11 b=10
return 0;
}
关系运算符
== 关系运算符
= 赋值运算符
逻辑运算符
逻辑运算符的表达式结果是一个bool类型
逻辑运算符的短路原则:
逻辑与连接的多个表达式,有一个为假时,后面的表达式就不再执行
逻辑或连接的多个表达式,有一个为真时,后面的表达式就不再执行
&& | 逻辑与 | 逻辑与连接多个表达式都为真时,整个表达式的结果为真 有一个表达式都为假时,整个表达式的结果为假 |
---|---|---|
|| | 逻辑或 | 逻辑或连接多个表达式有一个为真时,整个表达式的结果为真 所有表达式都为假时,整个表达式的结果为假 |
! | 逻辑非 | 表示逻辑取反,真变假 ,假变真(单目运算符) |
位运算符
以二进制的形式参与位运算,一般都是使用无符号的类型(unsigned),一般用于对硬件设备的控制以及对标志位的控制等
& | 按位与 | 按位运算,全1为1,有0为0 |
---|---|---|
| | 按位或 | 按位运算,有1为1,全0为0 |
^ | 按位异或 | 按位运算,不同为1,相同为0 |
~ | 按位取反 | 按位运算,0变1,1变0 |
<< | 按位左移 | 整个数据向左移动,舍弃高位,低位补0 |
>> | 按位右移 | 整个数据向右移动,舍弃低位,高位补0 |
小技巧:
0或任何数的结果都是任何数 ,1或任何数的结果都是1
1与任何数的结果都是任何数, 0与任何数的结果都是0
0异或任何数的结果都是任何数,1异或任何数的结果都是任何数取反
八个LED灯(编号:7 6 5 4 3 2 1),编写程序 操作LED灯:
1.将 1 4 5 7 号灯点亮
2.将 6 号灯点亮
3.将4 号灯熄灭
4.让3号灯闪烁(亮1秒 灭1秒)
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
unsigned char led =0;
//点亮1457灯 led=0xb2(10110010)
//如果赋值的方式 点亮的同时 也会把其他灯熄灭
led = led | 0xb2;
printf("led = %#x\n",led); //x=0xb2 10110010
//点亮6号灯 led=led|0x40 0100000
led = led |(1 << 6); //和上面写法一样
printf("led = %#x\n",led); //x=0xf2 11110010
//熄灭4号灯 led=led & 0xef 11101111
led = led & ~(1 << 4); //和上面写法一样
printf("led = %#x\n",led); //x=0xe2 11100010
//让3号灯闪烁
while(1){
led = led ^ (1 << 3);
printf("led = %#x\n",led); //Oxea 0xe2
sleep(1);
}
return 0;
}