初识C语言一:简单了解C语言

1. C语言是什么?

人与人聊天时,使用的是自然语言,比如你我现在用的汉语,或者英语、日语。但和计算机说话呢?我们就得用计算机语言。想象一下,现在全球有上千种计算机语言,简直比地球online还热闹!
通过这些语言,我们可以编写各种程序,让计算机为我们跑腿。C语言只是这个大家族中的一员,它的亲戚还有C++、Java、Go、Python等。

2. C语言的历史和辉煌

C语言最初是作为 Unix 系统的开发工具而发明的。
C语言的历史

3. 第一个C语言程序

#include <stdio.h>

int main()
{
	printf("hello C!\n");	// 在屏幕中打印出 hello C!
	return 0;
}	 

在 VS2022 中编写并运行

4. main函数

在C语言的世界里,不论你的程序有多长,都是从一个叫做 main 的特殊函数开始执行的,这就像是每场电影的开场白,告诉你故事要从哪里开始。main 函数也被称为程序的“主函数”,是所有行动的起点。
main 函数的名称前面通常会有一个 int 关键字,这个 int 表示当 main 函数执行完毕时,它会返回一个整型值。这就像是告诉计算机,“我已经完成了我的任务,这是我的工作报告”。因此,在 main 函数的结尾写上 return 0; 就好比是在说,“一切顺利,任务完成!”这样的完美收尾,确保了程序的整洁和一致性。

总结:
• main函数是程序的⼊⼝
• main函数有且仅有⼀个
• 即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个main函数(因为程序的⼊⼝只能有⼀个)

初次编程时,容易犯的一些错误就像是初学者的成长烦恼,它们是必经之路:
拼写错误:有时候,main 函数可能被错误地写成了 mian。就像是把“面条”说成了“条面”,电脑是不会理解的。
漏掉括号:忘记在 main 后面加上 () 。
使用中文符号:在代码中使用中文的括号或分号,可会让计算机一头雾水哦。
忘记分号:每条语句结束后应该有一个分号;忘记它就像是写文章时忘记了句号,让计算机不知道这段话什么时候结束。
这些错误很常见,但一旦掌握了,就像是找到了通往代码世界的正确钥匙。

5. printf和库函数

printf("hello C!\n");

在编程世界里,printf 函数就像是你的私人广播站,它负责把你想要分享的信息送到屏幕上,大声地对外界宣布。简单来说,printf 是一个非常实用的库函数,专门用于在标准输出设备(通常是屏幕)上显示信息。使用它的时候,只需将想展示的文字或者数据装进双引号里,传递给 printf,它就会在屏幕上将这些内容展示出来。

除了打印简单的字符串,printf 的才能远不止于此。它也能轻松打印各种类型的数据,比如数字、字符等,通过一些特定的格式符来指导 printf 如何展示这些多样的数据。这使得 printf 成为了编程时不可或缺的工具之一。

int n = 100;
printf("%d\n", n);
//printf打印整型
printf("%c\n", 'q');
//printf打印字符
printf("%lf\n", 3.14); 
//printf打印双精度浮点型


在printf函数中使用的 %d、 %c 等,可以想象它们是屏幕上的空白标签,等待填上相应的值。比如%d是为数字预留的位置,而%c则是为字符留的位置。当程序运行到这里时,这些占位符会被具体的值替换,就像在名片上把空白处填满一样。

而要让printf这个广播工具正常工作,我们需要先声明我们要使用它,这就需要引入一个叫做 stdio.h头文件。这个头文件就像是一个包含了使用printf必需工具的工具箱。在C语言中,引入头文件的方法很简单,只需要在代码的最开始加上一行特定的代码:

#include <stdio.h> 

这行代码就是告诉编译器:“hello!我要使用标准输入输出库中的工具,帮我准备好它们!”这样一来,你就可以自由使用printf来输出信息了。

那么,库函数究竟是什么呢?
想象一下,有一套专门的工具,可以帮助你完成各种常见的任务,无需你从头开始制作这些工具。在C语言的世界里,为了避免重复造轮子,提高程序员的开发效率,C语言的标准中定义了一组这样的工具——我们称之为函数。这些函数由各种编译器厂商根据C语言标准实现,并作为一个集合提供给程序员使用,这个集合就是所谓的“标准库”。
标准库中的函数被称为库函数。 基于这个标准,有些编译器厂商可能会添加一些特别的函数,这些额外的函数可能不会在其他编译器中找到,它们是某个编译器特有的。

通常,一系列相关的库函数会被声明在同一个头文件中。所以,如果你想使用这些便利的库函数,你需要在你的程序顶部包含相应的头文件。这就像是在告诉编译器:“我需要这个工具箱里的工具,请确保它们可用。”这样一来,你就可以自由使用这些功能强大的库函数了。
库函数⽐较多,提前了解可参考:库函数参考链接

6. 关键字介绍

在C语言中,有一些特殊的词汇,就像法律中的“不可侵犯条款”,这些词被专门保留作为C语言的基础结构。我们称这些特殊词汇为保留字关键字,比如:int、if、return等。
• 特殊意义:每个关键字在C语言中都扮演了独特的角色,它们是C语言的VIP,有着固定且重要的用途。
• 不可用作标识符:程序员在命名变量或函数时,不能使用这些关键字作为名字。就好比你不能给你的宠物命名为“if”,这会让编译器感到困惑。
• 不可创建:关键字是由C语言标准预设的,程序员无法创建新的关键字,它们是语言的一部分,不可更改。

下面是30个关键字

auto	break	 	case	char		const	continue	default	do	
double	else		enum	float		for		goto		if		int	
long	register	return	short		signed	sizeof		struct	
switch	typedef		union	unsigned	void	volatile	while

7. 字符和ASCII编码

当我们在键盘上打字时,无论是输入字母如’a’、‘q’,还是特殊符号如’@‘、’#‘,这些都被称为字符。在C语言中,字符被单引号括起来,例如:‘a’、‘b’、’@'。

在计算机的世界里,所有的数据最终都是以二进制的形式存储的。这就引出了一个问题:这些字符在内存中是如何以二进制存储的呢?为了避免每个人随意为这些字符分配不同的二进制代码,从而造成通信上的混乱,美国国家标准学会(ANSI)制定了一种统一的编码标准,那就是我们熟知的ASCII编码。在C语言中,字符的存储和处理就是遵循这种ASCII编码方式

通过ASCII编码,每个字符被赋予了一个特定的二进制数,这样无论在世界的哪个角落,只要遵循ASCII标准,输入的字符都能被准确识别和显示。这种统一的方法极大地简化了跨平台和国际间的数据交流。
ASCII 码表
虽然ASCII码表包含许多字符的编码,但实际上,我们并不需要记住表中的每一个数字。在需要时查阅即可。

不过,有几组特殊的数据是挺好掌握的,可以帮助我们更好地理解和使用ASCII编码:
• 大写字母:从’A’到’Z’,它们的ASCII码值从65到90。
• 小写字母:从’a’到’z’,它们的ASCII码值从97到122。
• 大写与小写字母差值:对应的大写和小写字母(比如’a’和’A’)之间的ASCII码值差为32。
• 数字字符:从’0’到’9’,它们的ASCII码值从48到57。
• 换行符:换行符’\n’的ASCII值是10。

此外,值得注意的是,ASCII码值从0到31的这32个字符被称为不可打印字符,它们不能直接打印在屏幕上观察。这些通常是控制字符,用于控制文本的行为,而不是直接显示文本内容。
了解这些基本的ASCII值可以在处理文本数据时,提高你的效率和准确性。

可打印字符展示

#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 32; i <= 127; i++)
	{
		printf("%c ", i);
		if (i % 16 == 15)
			printf("\n");
	}
	return 0;
}

可打印字符展示

8. 字符串和 \0

在C语言中,字符串是通过双引号括起来的一系列字符来表示的。例如,“abcdef” 就是一个字符串。这种方式使得字符串在C语言中的表述清晰直观。

当涉及到在屏幕上显示一个字符串时,我们通常会用到 printf 函数,它可以使用 %s 格式说明符来打印字符串。这个格式说明符告诉 printf 函数,预期的参数是一个字符串,并且应该直接将这个字符串显示在屏幕上。例如:

#include <stdio.h>

int main()
{
	printf("%s\n", "hello C");
	printf("hello c");

	return 0;
}

字符串

在C语言的字符串世界里,有一个小秘密:每个字符串的末尾都悄悄藏着一个 \0 字符,就像故事书的最后一页上写着“THE END”。这个 \0 ,也称为空字符,是字符串的结束标志。 它告诉计算机:“好了,故事到这里就结束了。” 这样,无论字符串有多长,计算机都知道在哪里停止阅读,确保它不会误闯到内存中不该去的地方。

VS2022的监视窗口观察字符串
字符串 “abcdef” 就像是一个装满字母的透明瓶子,你可以清楚地看到里面有六个字符:a, b, c, d, e, f。不过,这个瓶子的底部还巧妙地藏着一个看不见的塞子,这就是 \0 字符,一个特殊的转义字符,标志着字符串的结束。
当你使用 printf() 函数打印这个字符串或者用 strlen() 函数来测量它的长度时,这两个函数都是在遇到 \0 字符时自动停止。这个 \0 就好比是“停止”的信号,确保了函数不会超出字符串的实际边界去读取其他可能的内存内容。这个机制帮助保持了程序的安全和数据的准确性。

9. 转义字符

也许在前⾯的代码中你看到 \n , \0 很纳闷时啥。其实在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。

以 \n 为例,它是一个转义字符,用来表示换行。可以这样理解:反斜线 \ 充当了一个“魔法棒”,它触碰到 n 时,使得 n 的意义发生了变化,从一个普通的字符变成了一个控制字符——换行。这就是为什么同样包含 n,输出的效果却天差地别。

在C语言中,有许多这样的转义字符,它们各自有特定的功能,帮助我们在编写程序时更精确地控制输出。这些转义字符包括但不限于:
• \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
• \’ :⽤于表⽰字符常量’
• \" :⽤于表⽰⼀个字符串内部的双引号
• \\ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
• \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
• \b :退格键,光标回退⼀个字符,但不删除字符。
• \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
• \n :换⾏符。
• \r :回⻋符,光标移到同⼀⾏的开头。
• \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数。
• \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式
• \ddd :d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X
• \xdd :d d表⽰2个⼗六进制数字。如: \x30 表⽰字符0
• \0 :null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其ASCII码值是0.

代码演示:

#include <stdio.h>

int main()
{
	printf("%c\n", '\'');
	printf("%s\n", "\"");
	printf("c:\\test\\code\\test.c\n");
	printf("\a");	// 警报
	printf("%c\n", '\130'); //130是8进制,转换成10进制是88,以88作为ASCII码值的字符是
	printf("%c\n", '\x30'); //x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的

	return 0;
}


了解转义字符可以参考:转义字符参考

10. 语句和语句分类

C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:
• 空语句
• 表达式语句
• 函数调⽤语句
• 复合语句
• 控制语句

10.1 空语句

空语句是最简单的,⼀个分号就是⼀条语句,是空语句。

#include <stdio.h>

int main()
{
	;//空语句
	return 0;
}

空语句,⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。

10.2 表达式语句

表达式语句就是在表达式的后边加上分号。如下所⽰:

#include <stdio.h>

int main()
{
	int a = 20;
	int b = 0;
	b = a + 5; //表达式语句
	return 0;
}

10.3 函数调⽤语句

函数调⽤的时候,也会加上分号,就是函数调⽤语句。

#include <stdio.h>

int Add(int x, int y)
{
	return x+y;
}

int main()
{
	printf("hehe\n");//函数调⽤语句
	int ret = Add(2, 3);//函数调⽤语句
	return 0;
}

10.4 复合语句

复合语句其实就是前⾯讲过的代码块,成对括号中的代码就构成⼀个代码块,也被称为复合语句。

#include <stdio.h>

void print(int arr[], int sz) //函数的⼤括号中的代码也构成复合语句
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int i = 0;
	int arr[10] = {0};
	for(i=0; i<10; i++) //for循环的循环体的⼤括号中的就是复合语句
	{
		arr[i] = 10-i;
		printf("%d\n", arr[i]);
	}
	return 0;
}

10.5 控制语句

控制语句在编程中就像是交通信号灯,它们指导程序的执行流程,确保代码按照预定的路径运行。在C语言中,这些控制语句帮助我们实现三种基本的程序结构:顺序结构、选择结构和循环结构,每种结构都用于解决不同类型的问题。

C语言提供了九种控制语句,这些可以被分为以下三大类:

  1. 条件判断语句也叫分⽀语句:if语句、switch语句;
  2. 循环执⾏语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

通过这些控制语句,程序员可以编写出结构清晰、逻辑严谨的程序,从简单的数据处理到复杂的算法逻辑都能高效实现。

11. 注释是什么?为什么写注释?

注释在代码中的作用就像是放在博物馆艺术品旁边的说明牌,虽然它们不参与展览本身的运作,但却能帮助参观者更好地理解每件作品的意义。同样,在编程中,编译器在将代码转换为可执行程序时会忽略注释,这意味着注释不会影响程序的功能和性能。

注释主要是给编写它的程序员自己,或是将来可能会阅读这段代码的其他程序员看的。它们是对代码意图和逻辑的解释,帮助人们理解程序是如何工作的,尤其是在处理复杂逻辑时。

然而,虽然好的注释可以极大地提升代码的可读性和维护性,过度注释或者写一些显而易见的注释则可能反而造成阅读上的负担。不恰当的注释可能会使代码变得杂乱无章,难以理解。

同时,避免注释也不是一个好的实践,因为缺乏注释的代码可能会让后来者难以理解,增加维护的难度。良好的注释习惯反映了程序员的专业素质,而在职场中,良好的代码注释习惯也可能给面试官留下积极的印象,显示出你对代码质量和团队合作的重视。因此,建议适度地添加必要的注释,既能帮助自己未来更好地理解代码,也能协助团队成员更高效地协作。

11.1 注释的2种形式

在C语言中,注释就像是给代码穿上一层隐形的保护膜,对编译器不可见,但为程序员提供了宝贵的信息。C语言提供了两种注释方式,让我们可以灵活地添加说明和解释,以增强代码的可读性和维护性。

10.1.1 /**/ 的形式

第一种注释方法是用 /* 和 */ 包围的多行注释。这种形式的注释可以跨越多行,也可以嵌入到代码行中。

/* 注释 */
/*
这是⼀⾏注释
*/

这种注释形式可以灵活地插入到代码的任何位置,即使是在一个函数声明中。

int fopen(char* s /* file name */, int mode);

在上面的例子中,/* file name */ 用于解释函数的参数,而后面的代码仍然会被执行。
但必须记住,一定要写结束注释符号 */,否则会引起编译错误。

printf("a "); /* 注释⼀
printf("b ");
printf("c "); /* 注释⼆ */
printf("d ");

上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。
但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。
/**/ 的这个注释也不⽀持嵌套注释, /* 开始注释后,遇到第⼀个 */ 就认为注释结束了。

/*
printf("a ");
printf("b ");
printf("c "); /* 注释⼆ */
printf("d ");
*/

10.1.2 // 的形式

第二种注释方法是使用 //,它是在C99标准中引入的。这种单行注释从双斜杠开始到行末结束。

// 这是⼀⾏注释
int x = 1; // 这也是注释

不论是哪种注释方式,都不能放置在字符串内部。放在字符串中的注释符号会被视为普通字符。

printf("// hello /* world */ ");

上⾯⽰例中,双引号⾥⾯的注释符号,都会被视为普通字符,没有注释作⽤。

10.2 注释会被替换

在编译过程中,任何形式的注释都会被替换为一个空格。这意味着,例如,代码 min/* 这里是注释 */Value 会被编译为 min Value 而非 minValue。这一点在编写代码时需要特别注意,以避免意外的空格导致的问题。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值