说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
打印格式 | 含义 |
---|---|
%d | 输出一个有符号的10进制int类型 |
%o(字母o) | 输出8进制的int类型 |
%x | 输出16进制的int类型,字母以小写输出 |
%X | 输出16进制的int类型,字母以大写输出 |
%u | 输出一个10进制的无符号数 |
#include
int main() {
int a = 123; //定义变量a,以10进制方式赋值为123
int b = 0567; //定义变量b,以8进制方式赋值为0567
int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc
printf("a = %d\n", a);
printf("8进制:b = %o\n", b);
printf("10进制:b = %d\n", b);
printf("16进制:c = %x\n", c);
printf("16进制:c = %X\n", c);
printf("10进制:c = %d\n", c);
unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
printf("有符号方式打印:d = %d\n", d);
printf("无符号方式打印:d = %u\n", d);
return 0;
输出结果:
a = 123
8进制:b = 567
10进制:b = 375
16进制:c = abc
16进制:c = ABC
10进制:c = 2748
有符号方式打印:d = -1
无符号方式打印:d = 4294967295
}
scanf()
: 从键盘(标准输入)读取数据
示例1: 获取键盘输入 123
,并输出
int main() {
int num;
printf("请输入num的值:");
scanf("%d", &num);
printf("num=%d\n", num);
return 0;
}
运行结果:
请输入num的值:123
num=123
示例2: 键盘输入 1234 56
,并输出
因为是 %d
输出,所以遇到除了0-9的数就结束获取,然后打印,所以结果为1234
示例3: 如何通过 scanf
方法一次性获取键盘输入的两个值 123
和 456
,并输出
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int num;
int sum;
printf("请分别输入num和sum的值:");
scanf("%d %d", &num, &sum);
printf("num=%d\n", num);
printf("sum=%d\n", sum);
return 0;
}
运行结果:
请分别输入num和sum的值:123 456
num=123
sum=456
以上代码,如果只输入一个值 123456
,那么就会出现等待用户输入第二个数来复制给变量 sum
的
示例4: scanf(“%d\n”, &num);
方法中不要加 “\n”
数据类型 | 占用空间 |
---|---|
char(最小整型) | 1字节 |
short(短整型) | 2字节 |
int(整型) | 4字节 |
long(长整型) | Windows为4字节,Linux为4字节(32位),8字节(64位) |
long long(长长整型) | 8字节 |
补充:
注意:
整型常量 | 所需类型 |
---|---|
10 | 代表int类型 |
10l, 10L | 代表long类型 |
10ll, 10LL | 代表long long类型 |
10u, 10U | 代表unsigned int类型 |
10ul, 10UL | 代表unsigned long类型 |
10ull, 10ULL | 代表unsigned long long类型 |
打印格式 | 含义 |
---|---|
%hd | 输出short类型 |
%d | 输出int类型 |
%ld | 输出long类型 |
%lld | 输出long long类型 |
%hu | 输出unsigned short类型 |
%u | 输出unsigned int类型 |
%lu | 输出unsigned long类型 |
%llu | 输出unsigned long long类型 |
示例:
#include
int main()
{
short a = 10;
int b = 10;
long c = 10l; //或者10L 但一般直接写10 就可以了, 不用在常量后面加l
long long d = 10ll; //或者10LL
printf("sizeof(a) = %u\n", sizeof(a));
printf("sizeof(b) = %u\n", sizeof(b));
printf("sizeof(c) = %u\n", sizeof(c));
printf("sizeof(c) = %u\n", sizeof(d));
printf("short a = %hd\n", a);
printf("int b = %d\n", b);
printf("long c = %ld\n", c);
printf("long long d = %lld\n", d);
unsigned short a2 = 20u; // 一般不用在常量后面加u
unsigned int b2 = 20u;
unsigned long c2 = 20ul;
unsigned long long d2 = 20ull;
printf("unsigned short a2 = %hu\n", a2);
printf("unsigned int b2 = %u\n", b2);
printf("unsigned long c2 = %lu\n", c2);
printf("unsigned long long d2 = %llu\n", d2);
return 0;
}
输出结果:
sizeof(a) = 2
sizeof(b) = 4
sizeof(c) = 4
sizeof(c) = 8
short a = 10
int b = 10
long c = 10
long long d = 10
unsigned short a2 = 20
unsigned int b2 = 20
unsigned long c2 = 20
unsigned long long d2 = 20
sizeof
不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节sizeof
的返回值为 size_t
size_t
类型在 32位
操作系统下是 unsigned int
,是一个无符号的整数#include
int main() {
char a;
short b; // short int b; 此写法表示短整型 int 写不写无所谓
int c;
long d; // long int d; int 写不写无所谓
long long e;
// sizeof 用来测试数据类型的大小
int len = sizeof(a);
printf("%d\n", len);
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(c));
printf("%d\n", sizeof(d));
printf("%d\n", sizeof(e));
// 还可以直接如下打印出数据类型的大小
printf("%d\n", sizeof(int));
size_t r = sizeof(a);
printf("r = %u\n", r);//用无符号数的方式输出c的值
return 0;
}
输出结果:
1
2
4
4
8
4
r = 1
切换成 x64
位运行结果如下:
ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII 码大致由以下两部分组成:
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。 char
的本质就是一个1字节
大小的整型。
通过ASCII表可以看出一共有127个ASCII码,一个ASCII码值对应一个字符,也就是说使用127个ASCII码就能表示所有的字符了,而 char
类型不管有无符号都能存的下127,那么说用 char
类型就可以存得下一个字符,所以 char
类型也叫字符类型。
示例:
#include
int main() {
// 打印出字符a的的ASCII码
char ch1 = 'a';
char ch2 = 97;
char ch3 = 'A';
printf("%d\n", ch1); // 打印出字符a的ASCII码:97
// 打印出字符/n的ASCII码
printf("%d\n", '\n'); // 10
// 打印出ch2值(ASCII码)所对应的字符
printf("%c\n", ch2); // a
// 打印字符
printf("%c\n", ch1); // a
// 小写a转大写A
ch1 = ch1 - 32; //65
printf("%c\n", ch1); // A
//大写A转小写a
ch3 = ch3 + 32;
printf("%c\n", ch3); // a
// 字符的大小
printf("sizeof(ch) = %d\n", sizeof(ch1)); // sizeof(ch) = 1
printf("sizeof('a') = %d\n", sizeof('a')); // sizeof('a') = 4 等同于 sizeof(97)
// 字符转数字
char ch4 = '8'; // 字符'0'的ASCII码为48,字符'8'的ASCII码为56
int num = ch4 - '0'; // 即 56-48就等于数字8
printf("num=%d\n", num); // // num=8
//简化后则是 字符 - '0'即可将字符转为数字
ch4 = ch4 - '0';
printf("ch4=%d\n", ch4);// ch4=8
// 空字符
char ch5 = ' ';
printf("ch5=%d\n", ch5); //ch5=32 空字符的ASCII码为32
// 通过 +、-空字符就可以完成字符字母大小写转换了
printf("A = %c\n", 'a' - ' '); // A = A
printf("a = %c\n", 'A' + ' '); // a = a
return 0;
}
int main() {
char ch = 0;
char ch2 = 0;
printf("请输入字符ch的值:");
scanf("%c", &ch);
printf("ch=%c\n", ch); // ch=a
scanf("%c", &ch2);
printf("ch2=%c\n", ch2); // ch2=
return 0;
}
以上代码中 变量ch2 的值为 \n
回车,那么可以使用 %d
打印出 字符变量ch2 的 ASCII码
的值
可以通过在回车后再添加一个scanf函数来吃掉回车即可。
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 警报 | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符"\" | 092 |
’ | 代表一个单引号(撇号)字符 | 039 |
" | 代表一个双引号字符 | 034 |
? | 代表一个问号 | 063 |
\0 | 数字0 | 000 |
\ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
\xhh | 16进制转义字符,h范围0~9,a~f,A~F | 3位16进制 |
注意: 以上红色字体标注的为不可打印字符。
示例:
int main() {
printf("abc\bdef"); // abdef
printf("\n");
printf("abc\ndef"); // abc
// def
printf("\n");
printf("abc\rdef"); // def
printf("\n");
printf("abc\tdef"); // abc def
printf("\n");
printf("abc\\def"); // abc\def
printf("\n");
printf("abc\"def"); // abc"def
return 0;
}
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
数据类型 | 占用空间 |
---|---|
float(单精度浮点数) | 4字节 |
double(双精度浮点数) | 8字节 |
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
示例:
#include
int main() {
// 不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型
printf("%d\n", sizeof(3.14)); // double类型 8字节
printf("%d\n", sizeof(3.14f)); // float类型 4字节
float a = 3.14159265358979323846;
double b = 3.14159265358979363846;
// float 和 double 类型默认输出6位小数
printf("a=%f\n", a); // a=3.141593
printf("b=%lf\n", b); // b=3.141593
// float 和 double 打印8位小数
printf("a=%.8f\n", a); // a=3.14159274
printf("b=%.8lf\n", b); // b=3.14159265
// float类型能够保证的精度是7位有效数字 (第7位会根据第8位的值而被四舍五入,所以第7位有可能精确,也有可能不精确)
// double类型能够保证的精度是15位有效数字 (第15位会根据第16位的值而被四舍五入,所以第15位有可能精确,也有可能不精确)
printf("a=%.7f\n", a); // a=3.14159274
printf("b=%.15lf\n", b); // b=3.14159265
return 0;
}
限定符 | 含义 |
---|---|
extern | 声明一个变量,extern声明的变量没有建立存储空间。 extern int a;//变量在定义的时候创建存储空间 |
const | 定义一个常量,常量的值不能修改。 const int a = 10; |
volatile | 防止编译器优化代码 |
register | 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
示例:
#include
int main() {
//extern 关键字只做声明,不能做任何定义
//声明一个int类型变量a,a在这里没有建立存储空间
extern int a;
//a = 10; //err, 没有空间,就不可以赋值
// 定义一个int类型常量b
const int b;
// b = 5; // err, 常量的值不能修改
// 防止编译器优化代码
// 没有volatile修饰符,系统会去进行优化处理,如存储器映射的硬件寄存器,就需要每一次sum的值也就是i是多少
// 就好比你跟四个人相亲,你跟媒婆说你要最帅的,但媒婆就只给你看了四人当中最帅的那个人,而其实你的本意是想这四个人你都要看一下,然后选出最帅的那个人。
volatile int sum;
for (int i = 0; i < 100; i++)
{
sum = i;
}
printf("sum=%d", sum);
return 0;
}
字符串常量与字符常量的不同:
每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即 “a” 包含两个字符’a’和’\0’,\0 的ASCII码为 0
数字 0——>内存中存的是 0
字符 ‘0’——>内存中存的是 48
字符 ‘\0’——>内存中存的是 0
即 ‘\0’ == 0
#include
int main() {
// 打印字符串
printf("%s", "CSDN:cdtaogang");
return 0;
}
printf 是输出一个字符串,putchar 输出一个 char。
#include
int main() {
// 打印字符串
printf("%s\n", "CSDN:cdtaogang"); // CSDN:cdtaogang
// 使用putchar输出字符
char ch = 'a';
printf("%c\n", ch); // a
putchar(ch); // a
return 0;
}
printf格式字符:
打印格式 | 对应数据类型 | 含义 |
---|---|---|
%d | int | 接受整数值并将它表示为有符号的十进制整数 |
%hd | short int | 短整数 |
%hu | unsigned short | 无符号短整数 |
%o | unsigned int | 无符号8进制整数 |
%u | unsigned int | 无符号10进制整数 |
%x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF |
%f | float | 单精度浮点数 |
%lf | double | 双精度浮点数 |
%e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 |
%c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
%s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符) |
%p | void * | 以16进制形式输出指针 |
%% | % | 输出一个百分号 |
printf附加格式:
字符 | 含义 |
---|---|
l (字母l) | 附加在d,u,x,o前面,表示长整数 |
- | 左对齐 |
m (代表一个整数) | 数据最小宽度 |
0 (数字0) | 将输出的前面补上0直到占满指定列宽为止不可以搭配使用 - |
m.n (代表一个整数) | m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 |
示例:
#include
int main()
{
int a = 100;
printf("a = %d\n", a); // 格式化输出一个字符串 a = 100
printf("%p\n", &a); // 输出变量a在内存中的地址编号 0039FBF4
printf("%%d\n"); // 输出一个百分号 %d
char c = 'a';
putchar(c);//putchar只有一个参数,就是要输出的char a
long a2 = 100;
printf("%ld, %lx, %lo\n", a2, a2, a2); // 100, 64, 144
long long a3 = 1000;
printf("%lld, %llx, %llo\n", a3, a3, a3); // 1000, 3e8, 1750
int abc = 10;
printf("abc = '%6d'\n", abc); // abc = ' 10' 宽度占6位
printf("abc = '%-6d'\n", abc); // abc = '10 ' 左对齐,宽度占6位
printf("abc = '%06d'\n", abc); // abc = '000010' 宽度占6位,不足位数用0补齐
printf("abc = '%-06d'\n", abc); // abc = '10 ' // 左对齐和补0不能同时用 (改变了数的大小了),但是程序没进行补0操作
double d = 12.3;
printf("d = \' %-10.3lf \'\n", d); // d = ' 12.300 '
// m.n m指的是宽度 n指的是小数点的位数
printf("d=%10.2lf\n", d); // d= 12.30
double e = 1234.56;
printf("e=%lf\n", e); // e = 1234.560000
printf("e=%e\n", e); // e=1.234560e+03
printf("e=%E\n", e); // e=1.234560E+03
return 0;
}
示例:
int main() {
char ch;
// 使用scanf函数获取键盘输入的字符
//scanf("%c", &ch);
// 使用getchar函数获取键盘输入的字符
ch = getchar();
printf("ch=%c\n", ch); // ch=a
ch = getchar();
printf("ch=%c\n", ch); // ch= 跟scanf函数一样,第二次获取了\n 回车
// 获取键盘输入a\n 和 b\n
ch = getchar();
printf("ch=%c\n", ch); // ch=a
getchar(); // 为了获取多个键盘输入,那么方式跟scanf函数一样,在中间添加getchar函数来吃点 \n 回车
ch = getchar();
printf("ch=%c\n", ch); // ch=b
return 0;
}