一、开发工具
推荐使用Qt creator,优点是跨平台。
下载地址:Index of /archive/qt/5.12/5.12.12
选择qt-opensource-windows-x86-5.12.12.exe
二、认识C程序结构
1.创建一个C程序。
使用qt creator创建plain CApplication(non-qt project),代码如下:
#include <stdio.h>
int main()
{
printf("请输入一个整数:\n");
//新建一个数据类型:整型变量
int num;
//输入函数
scanf("%d",&num);
/*输出函数*/
printf("您输入的数是%d",num);
return 0;
}
注意:QT需要设置独立终端(项目->“build & run”->Run->“Run in Terminal”),否则无法接受输入参数。
代码说明:
1. #include <stdio.h>是预处理器指令,告诉编译器在编译之前要包含stdio.h文件(标准输入输出头文件)。 系统自带的头文件 使用 <>,程序员自己写的使用 " ";头文件(.h .hpp):定义函数,实现文件 (.c .cpp):函数的实现。
2. main函数:入口函数(主函数),程序从这里开始执行。每个C程序只能有一个入口函数。
3. 语句:C语言中每条语句都以”;“结尾;在一条语句中换行使用\ ,可以省略\。
4. 注释://c++风格注释 /* */ c风格注释
5. 函数:scanf输入函数;printf输出函数
输入输出函数占位符含义:
Code | 格式 |
%c | 字符 |
%d | 带符号整数 |
%i | 带符号整数 |
%e | 科学计数法, 使用小写"e" |
%E | 科学计数法, 使用大写"E" |
%f | 浮点数 |
%g | 使用%e或%f中较短的一个 |
%G | 使用%E或%f中较短的一个 |
%o | 八进制 |
%s | 一串字符 |
%u | 无符号整数 |
%x | 无符号十六进制数, 用小写字母 |
%X | 无符号十六进制数, 用大写字母 |
%p | 一个指针 |
%n | 参数应该是一个指向一个整数的指针 指向的是字符数放置的位置 |
%% | 一个'%'符号 |
三、C语言类型
基本类型:字符型、整型、浮点型
构造类型:数组、结构体、共用体、枚举
指针:*
空类型:void
1.基本类型:
整型:存储整数的类型
- 按照表示范围大小,分为:short(2字节)、int(2或4字节)、long(4字节)、long long(8个字节)
- 整型分为无符号整型和有符号整型
- 无符号整型使用unsigned表示,无符号整型只能表示非负整数。
- 有符号整型实用signed表示(signed可以省略),符号占用一个bit。
short类型
- 无符号表示范围:0~65535
- 有符号表示范围:-32768~32767
- int、long略
如果把一个超过类型范围的数赋值给这个类型的变量会怎样?
溢出:把一个范围大的类型值赋值给小的类型,会导致溢出
//无符号
unsigned short s1 = 65537;
printf("s1 = %d\n",s1);
//有符号
signed short s2 = 32769;
printf("s2 = %d\n",s2);//补码
输出:
s1 = 1
s2 = -32767
说明:
65537的二进制为:0001 0000 0000 0000 0001
unsigned short 只能保存16个二进制位,高位舍弃,所以s1存储的结果是0000 0000 0000 0001
有符号数据使用补码保存,所以需要先了解补码
补码(二进制):计算机中所有的数值都是以补码的形式存储的。
•正数的补码就是其本身;
•负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。
补码的设计目:
•使符号位能与有效值部分一起参加运算,从而简化运算规则.
•使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
举例:数据类型有符号char
7-5
=7+(-5)
=00000111[原]+10000101[原]
=00000111[补]+11111011[补]
=00000010[补]
=00000010[原]
2-4
=2+(-4)
=00000010[原]+10000100[原]
=00000010[补]+11111100[补]
=11111110[补]
=10000010[原]
(-1) + (-127)
= [1000 0001]原 + [1111 1111]原
= [1111 1111]补 + [1000 0001]补
= [1000 0000]补
= [1000 0000]原
注意:-128是个特殊的数,用原码和补码都用10000000表示(假设字长8位)
*补码转原码:对补码求补码
所以:
代码中s2 = 32769
32769二进制为1000 0000 0000 0001,复制给s2后,这个值被看做补码,还原成原码的值为:1111 1111 1111 1111最高位的1被当做符号,所以输出时显示为-32767(32767的二进制为0111 1111 1111 1111)。
进制
八进制:以0开头,如020,035
十六进制:以0x或0X开头,如0x15,0X16
代码:
int d = 20;
printf("十进制:d=%d\n",d);
d = 020;
printf("八进制:d=%d\n",d);
d = 0x20;
printf("十六进制:d=%d\n",d);
输出:
十进制:d=20
八进制:d=16
十六进制:d=32
字符型:是特殊的整型,用来表示ASCII字符,它存储整数,显示整数对应的ASCII码值。
//char c = 'a';
char c = 97;//ASCII中97对应字符a,效果一样
printf("c=%c\n",c);
printf("c=%d\n",c);
- 给char赋值,可以直接赋值字符,也可以赋值字符对应的ASCII码值
- 输出char类型,使用%c输出字符,使用%d输出字符对应的ASCII码值
很多编译器中的char类型区分有符号和无符号,在这些编译器中字符型直接当作整型使用。
unsigned char c1 = 99;
printf("c1 = %d\n",c1);
signed char c2 = -55;
printf("c2 = %d\n",c2);
浮点型就是数学中的科学计数法在计算机中的表示方法。
浮点型分为:float(4字节)、double(8字节)、long double(16字节,一般用不到)。
单精度浮点值:1位符号,8位指数,23位小数。
双精度浮点值。1位符号,11位指数,52位小数。
float和double,优先使用double,因为:
1,double精度高;
2,有些情况计算机对float的处理要比double复杂;
整型和浮点型转换的时候要考虑经度丢失的问题。
float f = 34.555;
printf("f = %e\n",f);
double dd = 5444.5566;
printf("dd = %1.9E\n",dd);
//精度1
int d2 = 1234567899;
float f1 = d2;
printf("f1 = %1.9f\n",f1);
//精度2
int m =10;
int n =4;
double res = (double)m/4;//两个整数相除,结果还是整数,小数部分舍弃
printf("res = %lf\n",res);
输出
f = 3.455500e+01
dd = 5.444556600E+03
f1 = 1234567936.000000000
res = 2.500000