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
位
关键字
目的
明白那些是关键字
含义
在代码中有特殊含义的单词
,
这种单词就成为关键字
关键字一览表
![](https://i-blog.csdnimg.cn/direct/8b6492fbdd6647c682f55741aa72a037.png)
![](https://i-blog.csdnimg.cn/direct/5fa8ca9d9d624cf3b93bc74b30a8c1e7.png)
标识符
含义
标记的符号,自定义的,如函数名,变量名,常量名,数组名,指针名,结构体名称,文件名等
标识符命名规则
强制规则
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);
此时我们会发现出现的值为负数与存的值不同