饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《数据结构入门》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
#include // (1)
int main() // (2)
{
/* 我的第一个 C 程序 */ // (3)
printf("Hello, World! \n"); // (4)
return 0; // (5)
}
这段代码只做了一件事情,就是向屏幕上输出一行字:
Hello, World!
。
( 1 ) (1) (1)stdio.h
是一个头文件 (标准输入输出头文件) ,#include
是一个预处理命令,用来引入头文件。当编译器遇到printf()
函数时,如果没有找到stdio.h
头文件,就会发生编译错误。
( 2 ) (2) (2)main()
作为这个程序的入口函数,代码都是从这个函数开始执行的。
( 3 ) (3) (3) 被/*
和*/
包围起来的代表注释,是给人看到,不进行代码的解析和执行。
( 4 ) (4) (4)printf
代表将内容输出到控制台上。其中\n
代表换行符。
( 5 ) (5) (5) 作为函数的返回值。
#include // (1)
int main() // (2)
{
/* 我的第一个 C 程序 */ // (3)
printf("光天化日学C语言! \n"); // (4)
return 0; // (5)
}
百度网盘下载
CSDN下载
#include
int main() {
printf("光天化日写C语言!\n");
return 0;
}
对于一个变量而言,有三部分组成:
1)变量类型;
2)变量名;
3)变量地址;
int Iloveyou;
1)变量类型
int
表示变量类型,是英文单词 Integer 的缩写,意思是整数。2)变量名
Iloveyou
表示变量名,也可以叫其它名字,例如:WhereIsHeroFrom
、ILoveYou1314
等等。Iloveyou
,用它来存放整数。int Iloveyou
表达了一个语句,要用分号来结束。需要注意的是,最后有一个分号,int Iloveyou
表达了一个语句,要用分号来结束。3)变量地址
Iloveyou
这个变量里: Iloveyou = 520;
=
在数学中叫 “等于号”,例如 1 + 1 = 2
,但在C语言中,这个过程叫做变量的赋值,简称赋值。赋值是指把数据放到内存的过程。 int Iloveyou;
Iloveyou = 520;
int Iloveyou = 520;
Iloveyou
的值变成 520 520 520; int Iloveyou = 520;
Iloveyou = 521;
Iloveyou = 522;
Iloveyou = 523;
int x, y, z = 5;
z
初始化为 5,等价于如下代码: int x;
int y;
int z = 5;
int a, b;
520 = a; // 错误
a = b; // 正确
【例题1】给出如下代码,求输出结果是什么。
#include
int main()
{
int a = 1314, b = 520;
b = a;
a = b;
printf("a=%d b=%d\n", a, b);
return 0;
}
char a = 'a';
short b, c, d = 1314, e, f;
int g = 5201314;
long long h = 123456789;
float i = 4.5;
double j = 4.50000;
love
、Iloveyou
这样的名字,为了表达变量的作用,这就叫 标识符,即 Identifier。int
、char
、long
、int
、unsigned int
等。_aa
,a123
,_
都是合法的变量,?*
、a a
、#
、都是非法的变量;123abc
不是一个合法的变量名;o
和O
不是同一个变量;【例题2】给出一段程序,请回答这段程序的运行结果。
#include
int main()
{
int IloveYou = 0;
ILoveYou = 1314;
ILoveYou = ILoveYou;
ILoveYou = 520;
printf("%d\n", ILoveYou);
return 0;
}
在C语言中,有三个函数可以用来在屏幕上输出数据,它们分别是:
1)puts() :只能输出字符串,并且输出结束后会自动换行;
2)putchar() :只能输出单个字符;
3)printf():可以输出各种类型的数据,作为最灵活、最复杂、最常用的输出函数,可以完全替代全面两者,所以是必须掌握的,今天我们就来全面了解一下这个函数。
printf
前几个章节都有提及,这个函数的命名含义是:Print(打印) 和 Format (格式) ,即 格式化输出。#include
int main()
{
int a = 520;
long long b = 1314;
printf("a is %d, b is %lld!\n", a, b);
return 0;
}
int
而言,我们利用%d
将要输出的内容进行格式化,然后输出,简单的理解就是把%d
替换为对应的变量,%lld
用于对long long
类型的变量进行格式化,所以这段代码的输出为:a is 520, b is 1314!
#include
int main()
{
float f = 1.2345;
double df = 123.45;
printf("f is %.3f, df is %.0lf\n", f, df);
return 0;
}
%f
来对单精度浮点数float
进行格式化;用%lf
来对双精度浮点数进行格式化,并且用.
加 “数字” 来代表要输出的数精确到小数点后几位,这段代码的输出为:f is 1.235, df is 123
#include
int main()
{
char ch = 'A';
printf("%c\n", ch);
return 0;
}
%c
来进行格式化;C语言中的字符是用单引号引起来的,当然,字符这个概念扯得太远,会单独开一个章节来讲,具体可以参考 ASCII 码。\n
,这个符号是一个转义符,它代表的不是两个字符(反斜杠\
和字母n
),而是换行的意思;A
【例题1】第1行输出1个1,第2行输出2个2,第3行输出3个3,第4行输出4个4。
#include
int main()
{
printf("1\n");
printf("22\n");
printf("333\n");
printf("4444\n");
return 0;
}
#include
int main()
{
printf("1\n22\n333\n4444\n");
return 0;
}
%s
进行格式化的即可,代码如下:#include
int main()
{
char str[100] = "I love you!";
printf("%s\n", str);
return 0;
}
I love you!
%
和一个字母,事实上,在百分号和字母之间,还有一些其它的内容。主要包含如下内容:
1)负号:如果有,则按照左对齐输出;
2)数字:指定字段最小宽度,如果不足则用空格填充;
3)小数点:用与将最小字段宽度和精度分开;
4)精度:用于指定字符串重要打印的而最大字符数、浮点数小数点后的位数、整型最小输出的数字数目;
【例题2】给定如下一段代码,求它的输出内容。
#include
int main()
{
double x = 520.1314;
int y = 520;
printf("[%10.5lf]\n", x);
printf("[%-10.5lf]\n", x);
printf("[%10.8d]\n", y);
printf("[%-10.8d]\n", y);
return 0;
}
[ 520.13140]
[520.13140 ]
[ 00000520]
[00000520 ]
#include
int main()
{
char name[100] = "Zhou";
int old = 18;
double meters = 1.7;
char spostfix = 's';
printf("My name is %s, %d years old, %.2lf meter%c.\n",
name, old, meters, spostfix);
return 0;
}
My name is Zhou, 18 years old, 1.70 meters.
在C语言中,有三个函数可以用来在键盘上输入数据,它们分别是:
1)gets() :用于输入一行字符串;
2)getchar() :用于输入单个字符;
3)scanf():可以输入各种类型的数据,作为最灵活、最复杂、最常用的输入函数,虽然无法完全替代前面两者,但是却是必须掌握的,今天我们就来全面了解一下这个函数。
scanf
的函数的命名含义是:Scan(扫描) 和 Format (格式) ,即 格式化输入。#include
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
1314↙
1314
其中
↙
代表回车,即我们通过键盘输入1314
,按下回车后,在屏幕上输出1314
。
类比输出,我们发现,输入和输出的差别在于:
( 1 ) (1) (1) 函数名不同;
( 2 ) (2) (2) 输入少了换行符\n
;
( 3 ) (3) (3) 输入多了取地址符&
;
#include
int main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d %d\n", a, b);
return 0;
}
520↙
1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
,按下回车,再输入1314
,按下回车后,在屏幕上输出520 1314
。
#include
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、空格
、1314
,按下回车后,在屏幕上输出520 1314
。
scanf
语句来完成。#include
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、n个空格
、1314
,按下回车后,在屏幕上输出520 1314
。
#include
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
520 1314↙
520 1314
其中
↙
代表回车,即我们通过键盘输入520
、1个空格
、1314
,按下回车后,在屏幕上输出520 1314
。
scanf()
是以回车来结算一次输入的。scanf()
开始读取用户输入的内容,并根据我们定义好的格式化内容从中提取有效数据,只要用户输入的内容和格式化内容匹配,就能够正确提取。#include
int main()
{
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
return 0;
}
1 2 3 4↙
1 2 3 4
1 2 3↙
4↙
1 2 3 4
1 2 3 4 5↙
1 2 3 4
scanf()
,如下:#include
int main()
{
int a, b, c, d, e;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
scanf("%d", &e);
printf("%d\n", e);
return 0;
}
1 2 3 4 5↙
1 2 3 4
5
scanf()
,而是放入了输入缓冲区中,当我们按下回车键,scanf()
才到输入缓冲区中读取数据。如果缓冲区中的数据符合 scanf()
给定的格式要求,那么就读取结束;否则,继续等待用户输入,或者读取失败。【例题1】给定一段代码,如下,并且给出一个输入,请问输出是什么。
#include
int main()
{
int a = 9, b = 8, c = 7, d = 6, e = 5;
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
scanf("%d", &e);
printf("%d\n", e);
return 0;
}
1 2b 3 4 5↙
printf
,如下:&
可以不加,如下:#include
int main()
{
char str[100];
scanf("%s", str); // (1)
printf("%s\n", str);
scanf("%s", &str); // (2)
printf("%s\n", str);
return 0;
}
#include
int main()
{
char str[100];
int height;
printf("请大侠输入姓名:");
scanf("%s", str);
printf("请大侠输入身高(cm):");
scanf("%d", &height);
printf("%s大侠,身高%dcm,骨骼惊奇,是百年难得一遇的人才,只要好好学习C语言,日后必成大器!\n", str, height);
return 0;
}
两只鞋子 = 1双鞋子;
二个抓手 = 1双手;
3个月 = 1个季度;
4个季度 = 1年
七进制:7天 = 1周;
十二进制:12瓶啤酒 = 1打;
二十四进制:24小时 = 1天;
六十进制:60秒 = 1分钟;60分钟 = 1小时;
0b
作为前缀,然后跟上0
和1
组成的数字,我们来看一段代码:#include
int main() {
int a = 0b101;
printf("%d\n", a);
return 0;
}
5
%d
代表输出的数是十进制,所以我们需要将二进制转换成十进制以后输出,0b101
的数学表示如下: ( 101 ) 2 (101)_2 (101)2进制 | 零 | 一 | 二 | 三 | 四 | 五 |
---|---|---|---|---|---|---|
二进制 | 0 | 1 | 10 | 11 | 100 | 101 |
十进制 | 0 | 1 | 2 | 3 | 4 | 5 |
101
对应于十进制下的 5。#include
int main() {
int a = 0123;
printf("%d\n", a);
return 0;
}
饭不食,水不饮,题必须刷
还不会C语言,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?上简单题! 《C语言入门100例》
LeetCode 太简单?大神盘他! 《夜深人静写算法》
83
0
,然后跟上0-7
的数字;123
这个八进制数转换成十进制后再输出。而转换结果就是83
,由于这里数字较大,我们已经无法一个一个数出来了,所以需要进行进制转换,关于进制转换,在第四节进制转换初步里再来讲解。0x
或者0X
作为前缀,跟上0-9
、a-f
、A-F
的数字,其中大小写字母的含义相同,分别代表从10
到15
的数字。如下表所示:小写字母 | 大写字母 | 代表数字 |
---|---|---|
a |
A |
10 |
b |
B |
11 |
c |
C |
12 |
d |
D |
13 |
e |
E |
14 |
f |
F |
15 |
#include
int main() {
int a = 0X123;
printf("%d\n", a);
return 0;
}
291
对于 X 进制的数来说,我们定义以下几个概念:
【概念1】对于数字部分从右往左编号为 0 到 n n n,第 i i i 个数字位表示为 d i d_i di,这个数字就是 d n . . . d 1 d 0 d_{n}...d_1d_0 dn...d1d0;
【概念2】每个数字位有一个权值;
【概念3】第 i i i 个数字位的权值为 X i X^i Xi;
0123
,转换成十进制,只需要套用公式:0X123
,转换成十进制,套用同样的公式,如下:291
我们可以通过如下方式,转换成 十六进制。291 除 16 ========== 余 3
18 除 16 =========== 余 2
1 除 16 ============ 余 1
83 除 8 ============ 余 3
10 除 8 ============ 余 2
1 除 8 ============= 余 1
a-z
、A-Z
这样的52个字母以及0-9
的数字还有一些常用的符号(例如?*#@!@#$%^&*()
等)在计算机中存储时也要使用二进制数来表示,具体用哪些二进制数字表示哪个符号,每个人都可以约定自己的一套规则,这就叫编码。0
到9
、标点符号,以及在英语中使用的特殊控制字符。%c
来控制,如下:#include
int main() {
printf("%c\n", '0');
printf("%c\n", 'A');
printf("%c\n", 'a');
printf("%c\n", '$');
return 0;
}
0
A
a
$
%d
来控制,如下:#include
int main() {
printf("%d\n", '0');
printf("%d\n", 'A');
printf("%d\n", 'a');
printf("%d\n", '$');
return 0;
}
48
65
97
36
'0'
的整数编码为48,字符'1'
的整数编码为49,以此类推。#include
int main() {
printf("%c\n", '0' + 5);
printf("%c\n", 'A' + 3);
printf("%c\n", 'a' + 5);
printf("%c\n", '$' + 1);
return 0;
}
5
D
f
%
'0'
向右偏移 5 个单位,就是字符'5'
;同样的,'A'
向右偏移3个单位,就是字符'D'
。【例题1】给出如下代码,给出它的输出结果。
#include
int main() {
printf("%c\n", 'A' - 10);
return 0;
}
'0'
加上1
以后等于'1'
,那么顺理成章可以得出:'0' < '1'
。'a' < 'b'
、'X' < 'Y'
。【例题2】请问
'a' < 'A'
还是'a' > 'A'
。
u
(unsigned
)代表无符号整数,l
(long
)代表长整型,ll
代表long long
。【例题1】说出以下整型常量中,哪些是非法的,为什么非法。
1314
520u
0xFoooooL
0XFeeeul
018888
0987UU
0520
0x4b
1024llul
30ll
030ul
3.1415927
4.5f
.1314
f
后缀代表 float
,用于区分double
。.1314
等价于0.1314
。xey
,如下: 1e9
5.2e000000
5.2e-1
1.1e2
10
的指数部分,所以是支持负数的。 'a'
'Q'
'8'
'?'
'+'
' '
'\n'
代表换行,\t
代表水平制表符(可理解为键盘上的 tab 键),'\\'
代表一个反斜杠,等等;'\ooo'
来代替一个字符,其中一个数字o
代表一个八进制数;也可以用 '\xhh'
来代表一个字符,具体见如下代码:#include
int main() {
char a = 65;
char b = '\101';
char c = '\x41';
printf("%c %c %c\n", a, b, c);
return 0;
}
A A A
101
和十六进制的41
在十进制下都是65
,代表的是大写字母'A'
的ASCII 码值。【例题1】请问如何输出一个单引号?
""
中的。一个字符串包含类似于字符常量的字符:普通字符、转义序列。#include
int main() {
printf( "光天化日学\x43语言!\n" );
return 0;
}
'\x43'
代表'C'
和其它字符组合,变成一个字符串常量。以上代码输出为:光天化日学C语言!
【例题2】如果我想要如下输出结果,请问,代码要怎么写?
"光天化日学C语言!"
""
引起来的字符串,是可以无缝连接的,如下代码:#include
int main() {
printf(
"光天化日学"
"C语言!\n"
);
return 0;
}
光天化日学C语言!
#define
预处理器可以定义一个常量如下:#include
#define TIPS "光天化日学\x43语言!\n"
#define love 1314
int main() {
printf( TIPS );
printf("%d\n", love);
return 0;
}
TIPS
都原文替换为"光天化日学\x43语言!\n"
;将所有love
替换为1314
。const
的用法也非常广泛,而且涉及到很多概念,这里只介绍最简单的用法,后面会开辟一个新的章节专门来讲它的用法。#include
const int love = 1314;
int main() {
printf( "%d\n", love );
return 0;
}
const
,这样就代表它是个常量了,在整个运行过程中都不能被修改。【例题3】下面这段代码会发生什么情况,自己编程试一下吧。
#include
const int love = 1314;
int main() {
love = 520;
printf( "%d\n", love );
return 0;
}
/ | 加法 | 减法 | 乘法 | 除法 |
---|---|---|---|---|
数学 | + | - | × \times × | ÷ |
C语言 | + | - | * | / |
a + b
代表两个操作数相加,代码如下:#include
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a + b = %d\n", a + b );
printf("c + d = %.3lf\n", c + d);
printf("a + c = %.3lf\n", a + c);
return 0;
}
a + b = 3
c + d = 3.000
a + c = 2.005
a - b
代表从第一个操作数中减去第二个操作数,代码如下:#include
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a - b = %d\n", a - b );
printf("c - d = %.3lf\n", c - d);
printf("a - c = %.3lf\n", a - c);
return 0;
}
a - b = -1
c - d = -0.990
a - c = -0.005
a * b
代表两个操作数相乘,代码如下:#include
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a * b = %d\n", a * b);
printf("c * d = %.3lf\n", c * d);
printf("a * c = %.3lf\n", a * c);
return 0;
}
a * b = 2
c * d = 2.005
a * c = 1.005
不同类型的除数和被除数会导致不同类型的运算结果。
1)当 除数 和 被除数 都是整数时,运算结果也是整数;
1.a)如果能整除,结果就是它们相除的商;
1.b)如果不能整除,那么就直接丢掉小数部分,只保留整数部分,即数学上的 取下整;
2)除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
#include
int main() {
int a = 6, b = 3, c = 4;
double d = 4;
printf("a / b = %d\n", a / b );
printf("a / c = %d\n", a / c);
printf("a / d = %.3lf\n", a / d);
return 0;
}
a / b = 2
a / c = 1
a / d = 1.500
a
能被整除b
,所以第一行输出它们的商,即 2
;a
不能被整除c
,所以第二行输出它们相除的下整,即 1
;a
和d
中,d
为浮点数,所以相除得到的也是浮点数;#include
int main() {
int a = 5, b = 0;
int c = a / b;
return 0;
}
%
。C语言中的取余运算只能针对整数,也就是说,%
两边都必须是整数,不能出现小数,否则会出现编译错误。5 % 3 = 2
、7 % 2 = 1
。当然,余数可以是正数也可以是负数,由
%
左边的整数决定:
1)如果%
左边是正数,那么余数也是正数;
2)如果%
左边是负数,那么余数也是负数。
#include
int main()
{
printf(
"9%%4=%d\n"
"9%%-4=%d\n"
"-9%%4=%d\n"
"-9%%-4=%d\n",
9%4,
9%-4,
-9%4,
-9%-4
);
return 0;
}
""
引起来的字符串是可以无缝连接的,所以这段代码里面四个字符串相当于一个。而%
在printf
中是用来做格式化的,所以想要输出到屏幕上,需要用%%
。于是,我们得到输出结果如下:9%4=1
9%-4=1
-9%4=-1
-9%-4=-1
x = x + 1;
x++;
++x;
#include
int main()
{
int x = 1;
printf( "x = %d\n", x++ );
printf( "x = %d\n", x );
return 0;
}
x = 1
x = 2
x
在自增前,就已经把值返回了,所以输出的是原值。我们再来看另一种情况:#include
int main()
{
int x = 1;
printf( "x = %d\n", ++x );
printf( "x = %d\n", x );
return 0;
}
x = 2
x = 2
x
先进行了自增,再把值返回,所以输出的是自增后的值。