C Primer Plus 第6版中文版 - 第2章 C语言概述

文章目录

    • 一、简单的C程序
    • 二、C 语言程序的基本语法
    • 三、提高程序可读性的技巧
      • 1、使用有意义的文件名、函数名、变量名
      • 2、合理使用注释
      • 3、使用空行分隔函数中概念上的的多个部分
      • 4、每条语句各占一行
    • 四、C 语言的进一步用法
      • 声明多个变量
      • 使用运算符
      • 在一行中打印多个变量
    • 五、多个函数
    • 六、程序 BUG
    • 七、关键字和保留字符
    • 八、练习

一、简单的C程序

第一个 C 语言程序示例,假设文件名为 first.c

#include <stdio.h>  // 这里是注释
int main(void)    // 一个简单的 C 程序
{
	int num;    // 定义一个名为 num 的整型变量
	num = 1;    // 给 num 变量赋值为 1
	printf("I am a simple ");   // 使用 printf() 函数输出内容
	printf("computer.\n");    // 在行最后使用转义符 \n 来进行换行
	printf("My favorite number is %d because it is first.\n", num);    // 使用占位符 %d 进行变量的格式化输出

	return 0;	
}

使用 gcc 命令对程序进行编译

gcc first.c

会在原目录下生成一个 a.out 的文件,这个文件可以直接运行。
在 linux 系统下,输入以下指令来运行这个文件:

./a.out

运行程序输出的结果应该是下面这样的:

I am a simple computer.
My favorite number is 1 because it is first.

二、C 语言程序的基本语法

#include <stdio.h>
这一行是告诉编译器把 stdio.h 这个文件的内容包含在程序中,stdio.h 是 C 编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。在一些不需要输入输出的程序里面,可以不使用这个模块,例如汽车里面的一些控制程序。

C 程序里面包含一个或多个函数,函数之间还可以进行相互的嵌套。

main 函数是 C 语言的基本函数,如果只有个函数,我们一般使用 main 来进行命名。

函数前面的 int 表明函数返回一个整型值。后面的圆括号里面的 void 表示这个函数不带参数,这里的参数是形式参数,是一个变量。

函数的开头一行和最后一行是一对{ } ,被花括号括起来的是函数体。

int 声明后面变量是整型,变量的类型有很多种,在 C 语言中需要先声明变量的类型,才能进行赋值操作。 Python 中可以不声明变量的类型而直接进行赋值操作。

num = 1 ; 是赋值表达句,赋值用 = ,判断相等用 ==

printf(""); 调用 printf() 这个函数来把内容输出到屏幕上。

\n 为转义字符,表示在这个位置输出一个换行符, \t 表示 Tab 键, \b 表示退格键(Backspace)。

最后一句里面的 %d 为格式化占位符,表示在这个位置输出一个变量,变量在语句的后面表示,这样可以很方便进行变量的输出。

return 0; 有返回值的 C 函数要有 return 语句,没有返回值的函数可以省略这个,但是最好养成在 main() 函数中保留 return 语句的习惯,在一些操作系统中它有实际的用途。

// 表示行注释,它后面的所有字符都会被编译器忽略。
/* 注释内容 */ 为块注释,如果要进行大段文字的注释,可以使用块注释。

三、提高程序可读性的技巧

1、使用有意义的文件名、函数名、变量名

如果实在没有办法只通过函数名或者变量名表达清楚它们的作用,就在后面加上注释。

2、合理使用注释

添加大量的注释虽然会在第一次编写程序时耗费一些时间,但是程序的后续维护会更加方便。

一般程序内的注释行数会占到总代码的一半左右。

3、使用空行分隔函数中概念上的的多个部分

空行在程序中也会被程序忽略,并且没有实际意义,但是通过使用空行可以把程序的各个部分分隔开,使程序更加容易阅读。

4、每条语句各占一行

这个听起来像是常识,不需要特别强调,但是还是会有人不按照这样的格式来写程序。

例如以下程序:

#include <stdio.h>
int main(void) { int four; four = 4;
printf(
		"%d\n"
); return 0;}

这样的程序格式也会被编译器识别,不会报错,但是非常难以阅读。

更加易读的格式是每条语句写一行,注释如果比较短就直接写在这一行这后面,如果注释较长,就另起一行。

四、C 语言的进一步用法

声明多个变量

可以在程序开始同时声明多个变量,每行声明一个就可以了。

例如:

int name;
int age;

也可以这样写:

int name, age;

使用运算符

可以在变量赋值时使用运算符(加、减、乘、除等)。

例如:

int m, km;
m = 5;
km = m / 1000;

运算符的使用规则和数学中一样,也可以使用括号。

在一行中打印多个变量

这个也很简单,在前面使用多个占位符,然后在后面按顺序写上多个变量名称就可以了。
例如:

printf("There is %d m in %d km.\n", m, km);

五、多个函数

要在一个程序中使用多个函数,需要先定义函数名称和函数主体,然后调用它。

函数名称的定义一般放在最前面,函数主体的内容一般放在 main 函数的后面。

也可以在第二个函数里面调用第三个函数。

为了整齐,一般把定义函数名的语句都写在最前面,定义函数主体内容的语句写在 main 函数的后面。
当然,最好是加上注释,来说明这些函数的用途。

#include <stdio.h>
void num(void);   // 定义函数名
void age(void);   // 定义第三个函数名

int main(void)
{
	num();    // 调用函数
}

void num(void)   // 定义函数主体
{
	printf("This is a test.\n")
	age();   // 调用第三个函数
}

void age(void)   // 定义第三个函数主体
{
	printf("I'm 25 years old.\n");
}

六、程序 BUG

在编写程序的过程中,不可避免的会出现一些错误,有些错误很小,可能只是误用了全角的逗号,或者是后面使用变量名的使用打错了一个字母。

这些错误在编译的时候,编译器会报错,提醒你错误的位置,和可能的原因。我们只需要进行对应的修改以后再重新编译即可。

有些错误可能不是书写错误,编译器并不会报错,这就需要我们进行认真排查。
例如,写出来的句子不通顺,或者是语法格式不规范。

书写错误和语法格式不规范的问题,后期我们使用集成开发环境(IDE)以后,可以帮我们解决很多这方面的问题。
句子不通顺的问题,就需要我们自己多多留心了。

七、关键字和保留字符

关键字是每种语言内部使用的一些词汇,他们已经有了特定的用途,不能再用他们来定义变量名或者函数名等,这样操作会引起歧义,所以被程序禁止使用。
如:int, if, return 等。

C 语言的关键字目前共有32个

关键字含义
auto声明自动变量
short声明短整型变量或函数
int声明整型变量或函数
long声明长整型变量或函数
float声明浮点型变量或函数
double声明双精度变量或函数
char声明字符型变量或函数
struct声明结构体变量或函数
union声明共用数据类型
enum声明枚举类型
typedef用以给数据类型取别名
const声明只读变量
unsigned声明无符号类型变量或函数
signed声明有符号类型变量或函数
extern声明变量是在其他文件正声明
register声明寄存器变量
static声明静态变量
volatile说明变量在程序执行中可被隐含地改变
void声明函数无返回值或无参数,声明无类型指针
if条件语句
else条件语句否定分支(与 if 连用)
switch用于开关语句
case开关语句分支
for一种循环语句
do循环语句的循环体
while循环语句的循环条件
goto无条件跳转语句
continue结束当前循环,开始下一轮循环
break跳出当前循环
default开关语句中的“其他”分支
sizeof计算数据类型长度
return子程序返回语句(可以带参数,也可不带参数)循环条件

还有一些保留标示符,C 语言里面已经指定了他们的用途,我们也不能使用,包括一些以下划线 _ 开头的的标示符和标准库函数名。

例如:
_Bool
_Complex
_Noreturn

八、练习

在初学时,章节内的每个例题和后面的练习题都要亲手敲一遍,熟悉 C 语言程序的基本结构,以及避免一些可能的语法问题。

只有亲自敲代码的时候出现了错误,并找出错误的地方和原因,那么以后就可以尽量避免再出现这种错误,或者再出现这种错误的时候就可以快速的找到问题,并解决它。

还是一句话:多练习,多思考。

热门文章

暂无图片
编程学习 ·

Java输出数组的内容

Java输出数组的内容_一万个小时-CSDN博客_java打印数组内容1. 输出内容最常见的方式// List<String>类型的列表List<String> list new ArrayList<String>();list.add("First");list.add("Second");list.add("Third");list.ad…
暂无图片
编程学习 ·

母螳螂的“魅惑之术”

在它们对大蝗虫发起进攻的时候&#xff0c;我认认真真地观察了一次&#xff0c;因为它们突然像触电一样浑身痉挛起来&#xff0c;警觉地面对限前这个大家伙&#xff0c;然后放下自己优雅的身段和祈祷的双手&#xff0c;摆出了一个可怕的姿势。我被眼前的一幕吓到了&#xff0c;…
暂无图片
编程学习 ·

疯狂填词 mad_libs 第9章9.9.2

#win7 python3.7.0 import os,reos.chdir(d:\documents\program_language) file1open(.\疯狂填词_d9z9d2_r.txt) file2open(.\疯狂填词_d9z9d2_w.txt,w) words[ADJECTIVE,NOUN,VERB,NOUN] str1file1.read()#方法1 for word in words :word_replaceinput(fEnter a {word} :)str1…
暂无图片
编程学习 ·

HBASE 高可用

为了保证HBASE是高可用的,所依赖的HDFS和zookeeper也要是高可用的. 通过参数hbase.rootdir指定了连接到Hadoop的地址,mycluster表示为Hadoop的集群. HBASE本身的高可用很简单,只要在一个健康的集群其他节点通过命令 hbase-daemon.sh start master启动一个Hmaster进程,这个Hmast…
暂无图片
编程学习 ·

js事件操作语法

一、事件的绑定语法 语法形式1 事件监听 标签对象.addEventListener(click,function(){}); 语法形式2 on语法绑定 标签对象.onclick function(){} on语法是通过 等于赋值绑定的事件处理函数 , 等于赋值本质上执行的是覆盖赋值,后赋值的数据会覆盖之前存储的数据,也就是on…
暂无图片
编程学习 ·

Photoshop插件--晕影动态--选区--脚本开发--PS插件

文章目录1.插件界面2.关键代码2.1 选区2.2 动态晕影3.作者寄语PS是一款栅格图像编辑软件&#xff0c;具有许多强大的功能&#xff0c;本文演示如何通过脚本实现晕影动态和选区相关功能&#xff0c;展示从互联网收集而来的一个小插件&#xff0c;供大家学习交流&#xff0c;请勿…
暂无图片
编程学习 ·

vs LNK1104 无法打开文件“xxx.obj”

写在前面&#xff1a; 向大家推荐两本新书&#xff0c;《深度学习计算机视觉实战》和《学习OpenCV4&#xff1a;基于Python的算法实战》。 《深度学习计算机视觉实战》讲了计算机视觉理论基础&#xff0c;讲了案例项目&#xff0c;讲了模型部署&#xff0c;这些项目学会之后可以…
暂无图片
编程学习 ·

工业元宇宙的定义与实施路线图

工业元宇宙的定义与实施路线图 李正海 1 工业元宇宙 给大家做一个关于工业元宇宙的定义。对于工业&#xff0c;从设计的角度来讲&#xff0c;现在的设计人员已经做到了普遍的三维设计&#xff0c;但是进入元宇宙时代&#xff0c;就不仅仅只是三维设计了&#xff0c;我们的目…
暂无图片
编程学习 ·

【leectode 2022.1.15】完成一半题目

有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例 1&#xff1a…
暂无图片
编程学习 ·

js 面试题总结

一、js原型与原型链 1. prototype 每个函数都有一个prototype属性&#xff0c;被称为显示原型 2._ _proto_ _ 每个实例对象都会有_ _proto_ _属性,其被称为隐式原型 每一个实例对象的隐式原型_ _proto_ _属性指向自身构造函数的显式原型prototype 3. constructor 每个prot…
暂无图片
编程学习 ·

java练习代码

打印自定义行数的空心菱形练习代码如下 import java.util.Scanner; public class daYinLengXing{public static void main(String[] args) {System.out.println("请输入行数");Scanner myScanner new Scanner(System.in);int g myScanner.nextInt();int num g%2;//…
暂无图片
编程学习 ·

RocketMQ-什么是死信队列?怎么解决

目录 什么是死信队列 死信队列的特征 死信消息的处理 什么是死信队列 当一条消息初次消费失败&#xff0c;消息队列会自动进行消费重试&#xff1b;达到最大重试次数后&#xff0c;若消费依然失败&#xff0c;则表明消费者在正常情况下无法正确地消费该消息&#xff0c;此时…
暂无图片
编程学习 ·

项目 cg day04

第4章 lua、Canal实现广告缓存 学习目标 Lua介绍 Lua语法 输出、变量定义、数据类型、流程控制(if..)、循环操作、函数、表(数组)、模块OpenResty介绍(理解配置) 封装了Nginx&#xff0c;并且提供了Lua扩展&#xff0c;大大提升了Nginx对并发处理的能&#xff0c;10K-1000K Lu…
暂无图片
编程学习 ·

输出三角形

#include <stdio.h> int main() { int i,j; for(i0;i<5;i) { for(j0;j<i;j) { printf("*"); } printf("\n"); } }
暂无图片
编程学习 ·

stm32的BOOTLOADER学习1

序言 最近计划学习stm32的BOOTLOADER学习,把学习过程记录下来 因为现在网上STM32C8T6还是比较贵的,根据我的需求flash空间小一些也可以,所以我决定使用stm32c6t6.这个芯片的空间是32kb的。 #熟悉芯片内部的空间地址 1、flash ROM&#xff1a; 大小32KB&#xff0c;范围&#xf…
暂无图片
编程学习 ·

通过awk和shell来限制IP多次访问之学不会你打死我

学不会你打死我 今天我们用shell脚本&#xff0c;awk工具来分析日志来判断是否存在扫描器来进行破解网站密码——限制访问次数过多的IP地址&#xff0c;通过Iptables来进行限制。代码在末尾 首先我们要先查看日志的格式&#xff0c;分析出我们需要筛选的内容&#xff0c;日志…
暂无图片
编程学习 ·

Python - 如何像程序员一样思考

在为计算机编写程序之前&#xff0c;您必须学会如何像程序员一样思考。学习像程序员一样思考对任何学生都很有价值。以下步骤可帮助任何人学习编码并了解计算机科学的价值——即使他们不打算成为计算机科学家。 顾名思义&#xff0c;Python经常被想要学习编程的人用作第一语言…
暂无图片
编程学习 ·

蓝桥杯python-数字三角形

问题描述 虽然我前后用了三种做法&#xff0c;但是我发现只有“优化思路_1”可以通过蓝桥杯官网中的测评&#xff0c;但是如果用c/c的话&#xff0c;每个都通得过&#xff0c;足以可见python的效率之低&#xff08;但耐不住人家好用啊&#xff08;哭笑&#xff09;&#xff09…