1.字符串
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。
char对应的输出字符为“%s”
[]内为空,说明不定义数组的大小,其大小根据后面的赋值的内容来定。
在数组中,用{}花括号,把多个内容给括起来。
“”双引号引起的是一串字符,‘’单引号引起来的是一个字符。
监视其内容,可以看到字符串,包含了\0的结束字符,而单个字符所组成的数组是需要手动添加结束字符的\0的。
当查看字符串长度strlen(),需要用到一个头文件,
15是随机的,
? 在书写连续多个问号时使用,防止他们被解析成三字母词
’ 用于表示字符常量
\“ 用于表示一个字符串内部的双引号
\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\dddddd 表示1~3个八进制的数字。
\xdddd 表示2个十六进制数字。
**
**
while
for循环
do…while
while循环示例
#include
int main()
{
int day = 0;
while (day < 300) {
printf("学习第%d 天\n", day);
day++;
}
if (day == 300)
{
printf("你太棒啦,为坚持学习三百天的你喝彩!\n");
}
return 0;
}
用函数的方法来解决两个数的和
定义函数,需要定义好参数—用来传递信息。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int Add(int x,int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d", &num1, &num2);
int sum = Add(num1, num2);
printf("%d\n", sum);
return 0;
}
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//10个整形1-10存起来
char ch[5] = { 'a','b','c' };//不完全初始化,剩余的默认为0;
return 0;
}
int arr[10] = { 1,2,3,4,5,6,7,8,9 };//用中括号把多个数组括起来
char arr[5] = { 'a','b','c' };//不完全初始化,剩余的部分默认为0;
//试一下循环输出
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
while (i < 10) {
printf("%d", arr[i]);
i++;
}
return 0;
}
算数操作符: + - * / % .
移位操作符:>>右移,<<左移。
#include
int main()
{
int a = 9 / 2;
float b = 9 / 2;//无论前面是什么输入类型,都进行的整数部分的结果
float c = 9 / 2.0;//当两边有一个数是小数就能求得算数的结果
printf("%d\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
#include
int main()
{
int a = 10;
//int b = a++;
int b = ++a;
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
前置++,先算后用 《========================》后置++,先用后算
int是4个字节,每个字节8个比特位,所以当我们输一个2,就是30个0加上10,一共32位。
3.位操作符
& 按位与
| 按位或
^ 按位异或
4.赋值操作符
= *+= -= = /= &= ^= |= >>= <<=
复合赋值
int a = 2;
a = a + 4;
a += 4;
a = a - 5;
a -= 5;
a = a % 3;
a %= 3;
a+b ,+左右,有2个操作数,双目操作数
单目操作数:只有一个操作数
正整数,原码反码,补码相同
一个整数的二进制有三种----针对的是负数
原码,反码,补码
最高为是符号位,
反码和补码的变化,
反码:符号位不变,其余取反,
补码:符号位不变,其余取反+1.
-1: 10000000000000000000000000000001(原码)
11111111111111111111111111111110(反码)
11111111111111111111111111111111(补码)—在内存中存的是补码,%d打印出来的原码,所以有一个相互转换的过程。
所以当我们用~,表示按位取反时,内存中得到的是补码,所以进行
-1,再取反,以此获得原码
所以输入0,用操作符~取反,会出来的是-1
在C语言里面,0表示假,非0就表示真。
6. 关系操作符
7.逻辑操作符
在C语言里面,0表示假,非0就表示真。
&&并且
|| 或者
? :
exp1 ? exp2 : exp3
表示的是,当exp1 成立,exp2计算,输出exp2的结果
当exp1不成立,exp2计算,输出exp2的结果。
#include
int main()
{
int a = 0;
int b = 1;
int max = 0;
/*if (a > b)
max = a;
else
max = b;*/
max = a > b ? a : b;//使用条件操作符
printf("%d\n", max);
}
逗号隔开的一串表达式,就是逗号表达式。
逗号表达式,是从左到右依次计算的。整个表达式的结果是最后一个表达式的结果。
#include
int main()
{
int a = 0;
int b = 1;
int c = 5;
// a=2,c=6,b=9
int d = (a = b + 1, c = a + 4, b = c + 3);
printf("%d\n",d);
}
用来访问数组下标
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[5]);
//arr[5]指的是访问下标是5的内容,【】下标引用操作符
return 0;
}
调用函数的时候,函数后面的()就是函数调用操作符。
**
&取址
C语言提供的关键字
1.不能自己创建
2.关键字不能作为变量名。
**
C语言风格的注释 /xxxxxx/--------------缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx---------------可以注释一行也可以注释多行
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
atuo是自动的创建,自动销毁的,针对局部变量,每个局部变量都是由auto修饰的。
#include
int main()
{
auto int a = 0;//默认前面使用auto的,但是因为都有,所以就省略了
//auto在新的c语言语法中也有其他用法--暂时不考虑
printf("%d\n",d);
}
在新的C语言中也有其他的用法,我们暂时不考虑
比如:
break ,break循环
case --switch …case…语句中使用
extern 是用来声明外部符号的。
register 寄存器关键字。
siged 有符号的 10 , -20
unsiged 无符号的
static 静态的。
struct 结构体
union 联合体,共用体
volatile c语言暂时不讲。
void 无-空
注意:
define ,include 是预处理指令(预编译期间处理的指令),不是关键字
int main(){
//大量被频繁使用的数据,放在寄存器中,来提升效率
register int num = 100;//建议num的值存放在寄存器中。
}
计算机中,数据的存储可以存放在哪呢?
1.寄存器 更小
2.高速缓冲 几十MB
3.内存 8G-16G
4.硬盘 500G买的
5.网盘 免费 2T
CPU作为中央处理器,来不断地读取内存的的数据,但是内存的速度因为不够快,就会导致CPU闲置,所以需要读取速度更快的寄存器
cpu(central processing unit)中央处理单元,是用来处理、控制信息的。平时我们购买机器的时候,CPU的版本就是极为重要的一项指标。有英特尔和AMD。
内存是用来存储信息的,在硬件构造上通常二者都被构造为独立的硬件,当然也有构造在一起成为一个硬件的,如单片机。
typedef:类型重定义,理解为类型重命名。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
//李雷----雷雷
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
3个用法,1.修饰局部变量
2.修饰全局变量
3.修饰函数
**
**
当有static 和没有static的时候,看输出的结果有什么差距。
#include
void test()
{
static int a = 1;
a++;
printf("%d", a);
}
int main() {
int i = 0;
while (i < 10) {
test();
i++;
}
return 0;
}
通过以上代码是否添加static的演示,能够发现,static的性质。
static修饰局部变量,改变了局部变量的生命周期(本质上改变了变量的存储类型)
内存会划分为几个区域,不同的区域,有不同的功能特点。
**
**
static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c)内部使用,其他源文件不能使用
全局变量,在其他源文件内部可以使用,是因为全局变量具有外部链接属性,但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了。
定义一个全局变量,
在这里插入图片描述
调用全局函数
当被static修饰后,
所以,static修饰函数,使得函数只能在自己所在得源文件内部使用,不能在其他源文件内调用。本质上:static是将函数的外部链接属性,改变成,内部链接属性(和static修饰全部变量一样!)
其中的“#”表示这是一条预处理命令,凡是以“#”开头的均为预处理命令。
“define”为宏定义命令。“标识符”为所定义的宏名。
“字符串”可以是常数、表达式、格式串等。
1.define定义符号常量
#define MAX 1000
2.define定义宏,
对于宏定义还要说明以下几点:
1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
2.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
3.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
带参宏定义的一般形式为: #define 宏名(形参表)字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include
//define 定义宏
#define ADD(x,y) ((x)+(y))
int main() {
printf("%d\n", 4 * ADD(2, 3));
return 0;
}