C语言基础

HelloWorld

C语言的HelloWorld

步骤
1: 创建一个文件 , 该文件的后缀名为 .c
2: 在该文件中编写一下代码
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
注意 :
所有标点符号都在英文状态下输入
括号成对书写
缩进
3, 保存退出

gcc编译器

作用

将代码文件编译为可执行文件

分类

一步到位
gcc 要编译的代码文件 -o 生成的可执行文件
注意 :
要编译的代码文件可以是多个
-o 生成的可执行文件 : 可以忽略不写 , 默认生成 a.out 文件
分步实现
预编译 : 头文件展示 , 宏替换 , 选择型编译
gcc -E 要编译的代码文件 -o 生成的预编译文件 .i
编译 : 检测代码错误 , 将预编译文件编译为汇编文件
gcc -S 预编译文件 .i -o 生成的汇编文件名 .s
汇编 : 将汇编文件转换为二进制文件
gcc -c 汇编文件名 .s -o 生成的二进制文件 .o
链接 : 将二进制文件与使用的三方文件连接生成可执行文件
gcc 二进制文件 .o -o 生成的可执行文件名

运行可执行文件

./ 可执行文件名
注意 : 要切换到可执行文件名所在的文件夹

注释

作用

1,解释说明
2,注销无用代码

注意

不会影响代码的运行

分类

单行注释
多行注释

单行注释

// 注释的内容

多行注释

/*
注释内容
111
222
*/
注意 : 在多行注释中不能使用多行注释

输出

作用

将内容输出到控制台

语法

printf("要输出的内容",值....);
注意:
输出的内容中有两种特殊的内容
1, 转意字符
2, 占位符
后面值的个数由前面内容中占位符的个数决定
输出情况 :
行刷新
满刷新
关闭刷新

转意字符

有特殊含义的字符为转意字符 , \ 开始 , 常用的有
\\                 \
\"                 "
\'                  '
\t                制表
\n               换行
\a               响铃
\0              字符串结束符

占位符

作用: 占位,常用的有
%s:字符串占位符
%c:字符占位符
%d:整数占位符
%f:浮点数占位符
%p:指针占位符
%x:十六进制数占位符
特殊应用:
%3d %03d %-3d %.2f
%3d: 要求宽度为 3 位,如果不足 3 位,前面空格补齐 ; 如果足够 3 位,此语句
无效
%03d :要求宽度为 3 位,如果不足 3 位,前面 0 补齐 ; 如果足够 3 位,此语
句无效
%-3d: 要求宽度为 3 位,如果不足 3 位,右对齐后面空格补齐 ; 左对齐前面 3
补空格 , 如果足够 3 位,此语句无效
%.2f :小数点后只保留 2

关键字

目的

明白那些是关键字

含义

在代码中有特殊含义的单词 , 这种单词就成为关键字

关键字一览表

标识符

含义

标记的符号,自定义的,如函数名,变量名,常量名,数组名,指针名,结构体名称,文件名等

标识符命名规则

强制规则
1,不能使用数字开头
2,不能使用关键字
3,不能使用特殊符号,_$除外
4,不建议使用中文
潜规则 : 见名知意
liunx 风格
多个单词之间使用 _ 连接
:
hello_world
HELLO_WORLD
驼峰式命名法
大驼峰
每个单词首字母大写
一般应用于类名 , 枚举名 , 接口名等可与对应 C C++ 中的结构体 , 枚举 ,
:
HelloWolrd
小驼峰
第一个单词首字母小写 , 其他单词首字母大写
一般应用与变量名 , 函数名 , 数组名等 , 对应 C C++ 中的变量名 , 函数名 ,
数组名
:
helloWolrd
全大写
所有字母全大写
一般应用与常量名
HELLO_WORLD
全小写
所有字母全小写
应用于包名对应 C C++ 中存储代码的文件夹
helloworld

num
typeof 不行 , 关键字
1_num 不行 , 不能使用数字开头
a 合规 , 但不建议使用 , 因为没有见名知意
num1 可以
hiNum 可以
hi num 不行 , 有特殊字符空格

数据类型

分类

基本数据类型
引用数据类型

基本数据类型

整型
short     2字节             16位          -2^15~2^15-1
 int        4字节             32位          -2^31~2^31-1   默认
long     8(64)/4(32)     64/32         -2^63~2^63-1 值后加l或L
浮点型
float      4字节 值后加f或F
double   8字节 默认
字符
char 1字节
注意:
字符使用''包裹
'a'
'1'
''
转意字符
'\\'
'\"'
...

sizeof关键字

作用

测量数据或数据类型的大小,单位字节

语法

sizeof(数据类型或值);

变量

作用

临时记录一个值可以被改变的数据

使用

1,声明 可有可无
语法:
extern 数据类型 变量名;
告知编译器有这个变量 , 但是此时系统并不会为其开辟内存空间
2,定义
语法:
数据类型 变量名;
告知系统开辟内存
注意 :
变量在定义时 , 系统会默认对其进行初始化
局部变量初始化值为随机数 , 因为局部变量默认使用 auto 修饰
全局变量初始化值为 0
局部变量 :
定义在函数中的变量称为局部变量
全局变量 :
定义子啊函数外的变量称为全局变量
;
#include <stdio.h>
// 函数外
int main()
{
// 函数中
return 0;
}
// 函数外
3,赋值
语法
变量名 = 值;
注意 :
等号两边数据类型要相同
一个变量可以多次赋值
变量的第一次赋值称为变量的初始化
4,使用
语法:
变量名
注意 :
一个变量可以使用多次
例子
定义一个变量记录人的年龄
int age; // 变量的定义
printf(" 年龄 :%d\n",age);// 变量的使用
age = 18; // 变量的赋值
printf(" 年龄 :%d\n",age);// 变量的使用
age = 17;
printf(" 年龄 :%d\n",age);// 变量的使用

数据类型转换

// 定义并初始化
int a = 'A';
printf("a = %d\n",a);
double d = a;

自动转换

概念 : 小类型的变量或值赋值给大类型的变量或值,无需操作

强制转换

概念 : 大类型的变量或值赋值给小类型的变量,需要强制转换

强制转换语法:

小类型变量 = (转换后的数据类型)要转换的值或变量
;
int a = 97;
//char c = (char)a;
char c;
c = (char)a;

注意

我们现在使用 gcc 编译器底层已经进行优化 , 所有在固定值转换时 , 没有强制依据可以正
常执行
a~z:97~122
A~Z:65~90

存储相关关键字

作用

建议寄存器存储
寄存器存储优点:
注意 :
寄存器中存储的数据容器较小 , 所以只会存储高频使用的变量
那么如果我们用 register 修饰的变量不是高频使用的 , 那么也有可能被寄存器中移

语法

register 数据类型 变量名;
不建议使用

volatile

作用

易改变的,使用该关键字修饰的变量,会强制系统从内存中取值

语法

volatile 数据类型 变量名;

经验

类似于瓦斯浓度等使用该关键字修饰

auto

作用

自动

语法

auto 数据类型 变量名;
注意 :
此时该变量的初始化为随机数
局部变量默认使用 auto 修饰

extern

作用

声明,告知编译器存在该变量或函数

语法

extern 数据类型 变量名;

其他关键字

sizeof

见上方 sizeof 关键字

typedef

作用

给已有数据类型起别名
语法
typedef 已有类型 别名;
typedef int integer;

进制

十进制

00,01,02,03,04,05,06,07,08,09,10,11,12...
printf 输出数据输出的就是 10 进制数
在计算机直接书写的数都是 10 进制数

二进制

0,1,10,11,100,101...
计算中 0b 开头的数为 2 进制数
int i= 0b0001;
printf("i = %d\n",i);

八进制

0,1,2,3,4,5,6,7,10,11,...
计算机中 0 开头的数为 8 进制数
010

十六进制

0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10
计算机中 0x 开头的数为 16进制数

进制转换

10 to 2

秘诀 : 使用 10 进制的数除 2 取余 , 余数倒读
13
2
-----
6 1
2
------
3 0
2
------
1 1
2
-------
1
1101

10 to 8

秘诀 : 使用 10 进制的数除 8 取余 , 余数倒读
13
8
----
1 5
8
----
1

10 to 16

秘诀 : 使用 10 进制的数除 16 取余 , 余数倒读
13
16
-----
13

2 to 10

秘诀 : 使用 2 进制所在位的数 *2 所在位 -1 次方 , 逐位相加
01 0010
0 * 2^5 + 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1*2^1 + 0 *2^0
0 + 16 + 0 + 0 + 2 + 0
18

8 to 10

秘诀 : 使用 8 进制所在位的数 *8 所在位 -1 次方 , 逐位相加
032
3 * 8^1 + 2 * 8^0
24 + 2
26

16 to 10

秘诀 : 使用 16 进制所在位的数 *16 所在位 -1 次方 , 逐位相加

源码,反码,补码

源码

数据对应的二进制数就是该数的源码

反码

正数
反码 = 源码
负数
反码 = 源码符号为不动,其他为依次取反
:
10
源码 :0000 0000 0000 0000 0000 0000 0000 1010
反码 :0000 0000 0000 0000 0000 0000 0000 1010
-10
源码 :1000 0000 0000 0000 0000 0000 0000 1010
反码 :1111 1111 1111 1111 1111 1111 1111 0101

补码

正数
补码 = 反码 = 源码
负数
补码 = 反码+1
:
10
源码 :0000 0000 0000 0000 0000 0000 0000 1010
反码 :0000 0000 0000 0000 0000 0000 0000 1010
补码 :0000 0000 0000 0000 0000 0000 0000 1010
-10
源码 :1000 0000 0000 0000 0000 0000 0000 1010
反码 :1111 1111 1111 1111 1111 1111 1111 0101
补码 :1111 1111 1111 1111 1111 1111 1111 0110

注意

计算机底层存储数据存储的是数据的补码
八进制数,十六进制数直接存储其源码

补码的意义(偏面试,了解即可)

统一了0与-0

0
源码 :0000 0000 0000 0000 0000 0000 0000 0000
反码 :0000 0000 0000 0000 0000 0000 0000 0000
补码 :0000 0000 0000 0000 0000 0000 0000 0000
-0
源码 :1000 0000 0000 0000 0000 0000 0000 0000
反码 :1111 1111 1111 1111 1111 1111 1111 1111
补码 :0000 0000 0000 0000 0000 0000 0000 0000

将减法运算转换为加法运算

9-6
9
源码 :0000 0000 0000 0000 0000 0000 0000 1001
反码 :0000 0000 0000 0000 0000 0000 0000 1001
补码 :0000 0000 0000 0000 0000 0000 0000 1001
-6
源码 :1000 0000 0000 0000 0000 0000 0000 0110
反码 :1111 1111 1111 1111 1111 1111 1111 1001
补码 :1111 1111 1111 1111 1111 1111 1111 1010
补码相加 :
1001
1010
0000 0000 0000 0000 0000 0000 0000 0011
3

数据的存与取

存:10 - 2(源码) - 反码 - 补码

取:补码 - 反码 - 2(源码) - 10

int x = 0x8000 0001;
1000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
printf("x = %d\n",x);
此时我们会发现出现的值为负数与存的值不同
  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值