helloworld程序:
解决提示窗一闪而过:
1. 通过 system()函数解决:
在 return 0;之前 添加 system("pause"); 函数调用。
2. 借助VS工具解决:
在项目上 ---》右键 ---》 属性 ---》 配置属性 ---》 连接器 ---》 系统 ---》 子系统
---》 在下拉框中选择“控制台 (/SUBSYSTEM:CONSOLE)”
两种编写 helloworld 的方式:
1. 借助VS编辑工具编写。
创建项目 --》 创建 helloworld.c 源文件 --》 写 helloworld程序 --》Ctrl + F5 执行。
2. 借助记事本、gcc编译工具编写。
gcc编译工具的环境变量配置:
在QT的安装目录中找 gcc.exe 目录位置。例如: C:\Qt\Qt5.5.0\Tools\mingw492_32\bin
我的电脑 --》属性 --》 高级系统设置 --》 环境变量 --》系统环境变量 --》 path --》 将gcc.exe 目录位置写入到 path的值中。
使用记事本创建 helloworld.c 文件 ——》 在记事本中写 helloworld 程序
--》 使用gcc编译工具 ,在记事本写的 helloworld.c 所在目录中,执行 gcc helloworld.c -o myhello.exe
--》 在终端(黑窗口)中,运行 : myhello.exe
单行注释://
多行注释:/* 注释内容 */
不允许嵌套使用。 多行中可嵌套单行。
system 函数:
执行系统命令。如: pause、cmd、calc、mspaint、notepad.....
system("cmd"); system("calc");
清屏命令:cls; system("cls");
gcc编译4步骤:【重点】
1. 预处理-Exxx.i预处理文件
gcc -E xxx.c -o xxx.i
1) 头文件展开。 --- 不检查语法错误。 可以展开任意文件。
2)宏定义替换。 --- 将宏名替换为宏值。
3)替换注释。--- 变成空行
4)展开条件编译 --- 根据条件来展开指令。
2. 编译-Sxxx.s汇编文件
gcc -S hello.i -o hello.s
1)逐行检查语法错误。【重点】--- 整个编译4步骤中最耗时的过程。
2)将C程序翻译成 汇编指令,得到.s 汇编文件。
3. 汇编-cxxx.o目标文件
gcc -c hello.s -o hello.o
1)翻译:将汇编指令翻译成对应的 二进制编码。
4. 链接无xxx.exe可执行文件。
gcc hello.o -o hello.exe
1)数据段合并
2)数据地址回填
3)库引入
调试程序:
添加行号:
工具--》选项 --》文本编辑器--》C/C++ --》行号 选中。
1. 设置断点。F5启动调试
2. 停止的位置,是尚未执行的指令。
3. 逐语句执行一下条 (F11):进入函数内部,逐条执行跟踪。
3. 逐过程执行一下条 (F10):不进入函数内部,逐条执行程序。
4. 添加监视:
调试 --》窗口 --》监视:输入监视变量名。自动监视变量值的变化。
常量:不会变化的数据。不能被修改。
1. “hello”、'A'、-10、3.1415926(浮点常量)
2. #define PI 3.1415 【强调】:没有分号结束标记。 【推荐】 定义宏: 定义语法: #define 宏名 宏值
3. const int a = 10;定义语法:const 类型名 变量名 = 变量值。
const关键字: 被该关键字修饰的变量,表示为只读变量。
变量:会变化的数据。能被修改。
定义语法:类型名 变量名 = 变量值。(一般方法)
变量三要素:类型名、变量名、变量值。int r = 3;float s = PI*r*r;(变量值是一个表达式)
变量的定义:int a = 40;
变量的声明:1) int a; 没有变量值的变量定义 叫做声明。
2)extern int a; 添加了关键字 extern。
1. 变量定义会开辟内存空间。变量声明不会开辟内存空间。
2. 变量要想使用必须有定义。
当编译器编译程序时,在变量使用之前,必须要看到变量定义。如果没有看到变量定义,编译器会自动找寻一个变量声明提升成为定义。
如果该变量的声明前有 extern 关键字,无法提升,不会继续定义这个变量。编译器会报错。
【建议】:定义变量时。尽量不要重名。
标识符:
变量和常量的统称。
命名规则:1. 通常常量使用大写、变量使用小写。大小写严格区分。
2. 只能使用字母、数组、下划线(_)命名标识符。且,数字不能开头。 a-z/A-Z/0-9/_
int a5ir = 10; ok
int _34F = 6; ok
float s2_i85c = 5.4; ok
int 98ti_54 = 4; error.
3. 禁止使用关键字和系统函数作为标识符名称。 main/system/printf/sleep....
sizeof关键字:
不是函数。用来求一个变量、类型的大小。 返回一个 无符号整数。 使用 %u 接收返回值,vs用%d接受也可以。
方法1: sizeof(类型名)-- sizeof(int)
方法2: sizeof(变量名)--- int a = 20; sizeof(a)
【了解】: sizeof 变量名/类型名举例1: sizeof int
举例2: sizeof a
有符号整型:
signed: 有符号 (超级不常用, 通常省略):int a = 10; a = -7;
int类型:%d 4 字节
int 名 = 值;
short类型:%hd 2 字节
short 名 = 值; short s1 = 3;
long类型:%ld 4 字节 (windows: 32/64: 4字节; Linux:32位:4字节, 64位:8字节)
long 名 = 值;long len = 6;
long long 类型:%lld 8 字节
long long 名= 值; long long llen = 70;
无符号整型:
unsigned: 无符号 只表示数据量,而没有方向(没有正负)
unsigned int类型:%u 4 字节
unsigned int 名 = 值;
unsigned int a = 40;
unsigned short类型:%hu 2 字节
unsigned short 名 = 值;
unsigned short s1 = 3;
unsigned long类型:%lu 4 字节 (windows: 32/64: 4字节; Linux:32位:4字节, 64位:8字节)
unsigned long 名 = 值;
unsigned long len = 6;
unsigned long long 类型:%llu 8 字节
unsigned long long 名 = 值;
unsigned long long llen = 70;
char字符类型:1字节
存储一个字符。本质是ASCII码。 ‘A’、‘a’、‘%’、‘#’、‘0’
格式匹配符: %c
‘A’:65
‘a’:97
‘0’:48
‘\n’:10
‘\0’: 0
转义字符:
‘\’将普通字符转为 特殊意。 将特殊字符转为本身意。
'\n' 和 ‘\0’
实型(浮点数、小数):
float:单精度浮点型。 4字节
float v1 = 4.345;
%f格式匹配符。 默认保留 6 位小数。
double:双精度浮点型。8字节 【默认】
double v2 = 5.678;
unsigned float v1 = 4.345; 无符号的 float 数据
unsigned double v2 = 5.678; 无符号的 float 数据
printf("n = %08.3f\n", n);
输出的含义为:显示8位数(包含小数点), 不足8位用0填充。并且保留3位小数。对第4位做四舍五入。
进制和转换:
十进制转2进制。--- 除2反向取余法。 【重点】
十进制转8进制。--- 除8反向取余法。
十进制转16进制。--- 除16反向取余法。
int a = 56;-- 111000
int b = 173; -- 10101101
2进制转10进制。
2^10 = 1024
2^9 = 512
2^8 = 256
2^7 = 128
2^6 = 64
2^5 = 32
2^4 = 16
2^3 = 8
2^2 = 4
8进制:
8进制转10进制。
定义8进制数语法:
056: 零开头,每位数0~7之间。---- 46
0124: ---- 84
8进制转2进制。
按421码将每个八进制位展开。
056:5--》 101。 6--》 110 。
101110
05326:5 --》 101。 3--》 011。 2--》 010。 6--》 110
2进制转8进制:
1 010 111 010 110:012726
自右向左,每3位一组,按421码转换。高位不足三位补0
16进制:
语法: 以0x开头,每位 取 0-9/A-F/a-f
A -- 10
B -- 11
C -- 12
D -- 13
E -- 14
F -- 15
16 -- 10:
0x1A: 16+10 = 26
0x13F:15+3x16+256
16 -- 2:
0x1A:00011010
0x13F:000100111111
2 -- 16:
0001 0011 1111:13F
自右向左,每4位一组,按8421码转换。高位不足三位补0
总结:
int m = 0x15F4;
int n = 345;
int var = 010011; // 不允许。 不能给变量直接复制 二进制数据。
输出格式:
%d %u %o %x %hd %hu %ld %lu %lld %llu %c %f %lf
%d %u %x %c %s
存储知识:
1 bit位 就是一个 二进制位
一个字节 1B = 8bit位。
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
源码反码补码:【了解】
源码:
43 -> 00101011
-43 --> 10101011
反码:
43 -> 00101011
-43 --> 10101011
11010100
补码:(现今计算机采用的存储形式)
43 -> 00101011: 正数不变
-43 --> 11010101: 负数,最高位表符号位, 其余取反+1
43-27 ==》 43 + -27
人为规定: 10000000 --》 -128
-------------------------------------------------
char 类型:1字节 8个bit位。 数值位有7个。
有符号: -2^7 --- 2^7-1 == -2^(8-1) -- 2(8-1) -1
--》 -128 ~ 127
无符号: 0 ~ 2^8 -1
--》 0~255
不要超出该数据类型的存储范围。
short类型:2字节 16bit
有符号: -2^15 --- 2^15-1 == -2^(16-1) -- 2(16-1) -1
--》 -32768 ~ 32767
无符号: 0 ~ 2^8 -1
--》 0~65535
int 类型:4字节-2^(32-1) -- 2^(32-1)-1
有符号:
--》 -2147483648 ~ 2147483647
无符号:0~2^32 -1
--》 0~4294967295
long类型:4字节
有符号:
--》 -2147483648 ~ 2147483647
无符号:0~2^32 -1
--》 0~4294967295
longlong 类型:8字节
有符号:
--》 -2^(63) ~ 2^(63)-1
无符号:
--》 0~2^63-1