第一个c语言程序
#include <stdio.h> //.h表示头文件 stdio standard 标准 io input output
int main()
{
printf("Hello World\n");
return 0;
}
批处理指令
不同于语句,没有分号,写在程序的最前面
常用的一般有包含头文件/宏定义
常用头文件及其库函数
- <stdio.h>
- printf() 格式化输出函数
- scanf() 格式化输入函数
- EOF -1
- fclose, fopen → 文件操作的一些函数
- getchar() 获得一个字符
- char a = getchar();
- putchar(a) 输出一个字符
- gets() 输入一个字符串
- puts() 输出一个字符串
- sscanf()
- sprintf()
- <stdlib.h>
- malloc
- rand
- abs(整数)
- <math.h>
- sqrt()
- pow(a, b)
- log() 返回以e为底的对数
- fabs(浮点数)
- sin(), cos(), tan(),acos()
- ceil(向上取整),floor(向下取整),round(四舍五入)
- <string.h>
- strlen()
- strcpy()
- strcmp()
- strcat()
精确定义π
acos(-1.0)
main函数
int main()
主函数, 程序的入口,它的函数返回类型为int, 它没有参数
return 0;
与main前面的int相对应, 向操作系统给返回0,表示程序正常结束
{ }
函数体
printf()函数
printf("%% \\ \" \' \" ()[]{} ");
printf会把""里的内容原封不动的打印到屏幕上
转义字符以及一些特殊情况
如果打印的内容跟""有冲突/歧义, 比如 %(占位符) '(字符常量) "(字符串) \(转义字符)
, 想把他们打印出来,就需要用转义字符
有特殊含义的符号
- \ 转义字符
- \n 换行
- \t 制表符
- \ 打印一个反斜杠
- " 字符串 ’ 字符常量
- %%(特例)
- a[] 数组
- a() 函数
- { } 函数体
- % 占位符
- “a” 字符串 “a\0”
- ‘a’ 字符常量
注释
// 注释某一行
/*
注释某一个代码块
*/
codeblocks里
//快速注释快捷键 ctrl + shift + c
// 快速取消注释快捷键 ctrl + shift + x
vscode里
ctrl + /
强制类型转换
(转换的类型) 变量名
(int) 3.5
double a = 4.5;
int b = (int) a;
//b = 4
精度低的转精度高的一般影响不大,但精度高的转精度低的可能会损失精度
细说printf() 和 scanf()
-
占位符与格式化
如果说""里面没有占位符的话,其他的内容会原封不动的输出出来,如果有占位符,它就会把这个地方用后面对应的参数按照对应的格式来填充,然后输出填充后的内容
printf("1"); // 1
printf("%d", 1);
//%d表示这个地方需要填入一个整数,填入的这个值在后面的参数那儿
int a = 1;
printf("%d", a);
//后面的参数可以是变量,也可以是常量
int a = 2, b = 3;
printf("b = %d, a = %d", b, a);
//占位符跟后面的参数一一对应的
常见的占位符(与数据类型是一一对应的)
%d / %i 整型 → int
%f 单精度浮点型 → float
%lf 双精度浮点型 → double
%lld → long long (int)
%c → 字符型变量 → char
%s → 字符数组/字符串 → char[] / char*
%p → 指针变量
%u → 无符号 → unsigned
%llu → unsigned long long
%o → 8进制
%x → 16进制 abcde
%X → 16进制 ABCDE
常见前缀
0x → 16进制数
0b → 2进制数
0 → 8进制数
数据类型
char 字符型变量
int 整型变量
( short (int), long (int) )
long long (int) 更长的整型
float 单精度浮点型
double 双精度浮点型
(long double)
char[] 字符数组/字符串
计算机的存储单位
计算机中最小的存储单位是bit(位), 往上有 byte(b), kb, mb, gb, tb…
除了byte和bit是8进制,其他的都是1024进制
1 byte = 8 bit
1 kb = 1024 byte
1mb = 1024 kb
有符号的数据类型,最高位表示的是正负,0表示正,1表示负,因此实际用来存储这个类型的位要少一位的
一个有m个二进制位的有符号的数据类型, 表示的数据范围[-2 ^ (m - 1) ~ 2 ^ (m - 1) - 1]
无符号的数据类型(被u修饰的),用全部的位都来表示大小
一个有m个二进制位的无符号的数据类型, 表示的数据范围[0, 2 ^ m - 1]
char:字符型(1字节, 8bit)
- 一个字符,计算机存储字符的时候,实际上存储的是它的ASCII码,因此,字符变量的本质其实是一个整数(0~127与一个符号的映射关系)
- 一定要区别好0 和 ‘0’
printf("%d", '0');
printf("%d", 0);
- ASCII码表
- 可以用%c的格式来打印一个整数,看他对应的符号是啥;也可以用%d来打印一个符号(字符常量),来看它对应的ascii码值是多少
- 常用的几个ascii码值
- ‘0’ → 48
- ‘a’ → 97
- ‘A’ → 65
- 小写字母比大写字母的ASCII码值要大32
- 可以利用小写字母与’a’的差值与大写字母与’A’的差值相同来进行大小写的转换→
ch - 'a' + 'A'
和ch - 'A' + 'a'
int:整型(4字节, 32bit)
- 范围
- 有符号[-2^31, 2^31 - 1]
- 无符号 [0 ~ 2^32 - 1]
- 数量级 10^9
long long int: 更长的整型(8字节, 64位)
- 范围
- 有符号[-2^63, 2^63 - 1]
- 无符号 [0 ~ 2^64 - 1]
- 数量级 10^18
float: 单精度浮点型(4 字节), 精度大概在小数点后4~5
double: 双精度浮点型(8字节), 精度大概在小数点后13~14位
能用double就不用float
-
细说printf() 和 scanf() 之 宽度与精度
宽度(放在.前面)→ 占了几个位置(空格) %md 来指定宽度,会用' '来填充不足的宽度(空格), 如果m比原来这个数的位数要多,就会让这个数从初始的左对齐变成右对齐,如果想再让他变回左对齐,就加个负号 %-md %-6d %0md 会用0来填充不足的宽度(空格),%-0md 精度(放在.后面) → 显示的时候保留几位 %.mf 一般用于保留几位小数 可以把宽度和精度组合起来
-
细说printf() 和 scanf() 之 返回值
printf() 如果成功,则返回写入的字符总数,否则返回一个负数。
printf("%d", printf("123"));
1233
scanf() 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。