C语言入门——C语言概述
C语言入门——C语言概述
- 一. 简单的C程序示例
- 二. 示例解释
- (一). 第一遍:快速概要
- (二). 第二遍:程序细节
- 1. #include 指令和头文件
- 2. main() 函数
- 3. 注释
- 4. 花括号、函数体和块
- 5. 声明
- (1). 数据类型
- (2). 命名
- (3). 声明变量的4个理由
- 6. 赋值
- 7. printf() 函数
- 8. return 语句
- 三. 简单程序的结构
- 四. 提高程序可读性的技巧
- 五. 进一步使用C
- (一). 程序说明
- (二). 多条声明
- (三). 乘法
- (四). 打印多个值
- 六. 多个函数
- 七. 调试程序
- (一). 语法错误
- (二). 语意错误
- (三). 程序状态
- 八. 关键字和保留标识符
- 九. 关键概念
- 十. 本章小结
- 十一. 复习题
- 1. C 语言的基本模块是什么?
- 2. 什么是语法错误?
- 3. 什么是语义错误?
- 4. Indiana Sloth 编写了下面的程序,并征求你的意见,请帮助他评定。
- 5. 假设下面的 4 个例子都是完整程序中的一部分,它们分别输出什么结果?
- 6. 在main、int、function、char、=中,哪些是 C语言的关键字?
- 7. 如何以下面的格式输出变量 words 和 lines 的值(这里,3020 和350代表两个变量的值)。There were 3020 words and 350 lines.
- 8. 考虑下面的程序。请问,在执行完第 7 行、第 8 行、第9 行后,程序的状态分别是什么?
- 9. 考虑下面的程序。请问,在执行完第 7 行、第 8 行、第9 行后,程序的状态分别是什么?
- 十二. 编程练习
- 1. 打印 Gustav Mahler 的名和姓。
- 2. 打印你的姓名和电话。
- 3. 把你的年龄转换成天数,并显示这两个值。不考虑闰年。
- 4. 调用两个自定义函数:jolly() 打印一遍 "For he's a jolly good fellow!",调用三次,deny() 打印 "Which nobody can deny!"
- 5. 调用两个自定义函数:br() 打印一遍 "Brazil,Russia",ic() 打印一遍 "India,China"
- 6. 创建一个整型变量 toes ,并将 toes 设置为 10 。程序中要计算 toes 的两倍和 toes 的平方,并打印三个值。
- 7. 定义一个函数,被调用一次打印一次“Smile!”。
- 8. 编写一个程序,用于调用一个名为one_three()函数,该函数在一行打印“One”,再调用另一个函数 two(),然后在另一行打印单词“three”。two()函数在一行显示单词“two”。main()函数在调用 one_three()函数前要打印短语“Staring now:”,并在调用完毕后显示短语“done!”。
本文仅为个人学习记录,不建议阅读
本文主要根据异步图书的C Primer Plus一书进行学习
一. 简单的C程序示例
程序清单2.1 first.c程序
#include <stdio.h>
int main(void) /* 一个简单的 C 程序 */
{int num; /* 定义一个名为 num 的变量 */num = 1; /* 为 num 赋一个值 */printf("I am a simple "); /* 使用 printf() 函数 */printf("computer.\n");printf("My favorite number is %d because it is first.\n",num);return 0;
}
输出结果为:
I am a simple computer.
My favorite number is 1 because it is first.
程序调整
程序的输出如果在屏幕上一闪而过,说明程序运行结束后自动关闭窗口。此时可以在程序中添加额外的代码,让窗口等待用户按下一个键后才关闭。
例如,在程序的return语句前添加一行代码:getchar();
这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭。
二. 示例解释
(一). 第一遍:快速概要
本节简述程序中的每行代码的作用。
#include <stdio.h> <-包含另一个文件
该行告诉编译器把 stdio.h 的内容包含在当前程序中。
stdio.h 是 C 编译器软件包的标准部分,提供键盘输入和屏幕输出的支持。
int main(void) <-函数名
C 程序包含一个或多个函数,它们是 C 程序的基本模块。
圆括号表明 main( ) 是一个函数名,
int 表明 main( ) 函数返回一个整数,
void 表明 main( ) 不带任何参数。
/* 一个简单的 C 程序*/ <-注释
注释在/和/两个符号之间,这些注释能提高程序的可读性。
注意,注释只是为了帮助读者理解程序,编译器会忽略它们。
{ <-函数体的开始
左花括号表示函数定义的开始,右花括号 ( } ) 表示函数定义结束。
int num; <-声明
该声明表明,将使用一个名为 num 的变量,而且 num 是 int ( 整形 ) 类型。
num = 1; <-赋值表达式语句
语句 num = 1;把值1赋给名为 num 的变量。
printf("I am a simple "); <-调用一个函数
该语句使用 printf() 函数,在屏幕上显示 I am a simple,光标停在同一行。printf() 是标准的C库函数。在程序中使用函数叫做调用函数。
printf("computer.\n"); <-调用另一个函数
代码\n告诉计算机另起一行,即把光标移至下一行。
printf("My favorite number is %d because it is first.\n",num);
最后调用的 printf() 把 num 的值 ( 1 ) 内嵌在双引号括起来的内容中一并打印。
%d告诉计算机以何种形式输出 num 的值,打印在何处。
return 0; <-return 语句
C函数可以给调用方提供 ( 或返回 ) 一个数。目前,可暂时把改行看作是结束 main( ) 函数的要求。
} <-结束
必须以右花括号表示程序结束。
(二). 第二遍:程序细节
本节详细讨论代码的含义。
1. #include 指令和头文件
预处理器指令 ( preprocessor directive ) 中的#include 表示对头文件的引用。
头文件内一般包含编译器创建可执行程序时要用的信息,例如,各种系统标准函数库信息、预定义常量及其他预编译代码信息。
C 语言在编译源代码时会提前对这些代码进行相关处理,因此也称为预处理 ( preprocessing ) 。
所有的C编译器软件包都提供stdio.h文件,该文件的含义是标准输入/输出头文件。通常,在C程序顶部的消息集合被称为头文件 ( header ) 。
注意 为什么不内置输入和输出
原因之一是,并非所有的程序都会用到I/O ( 输入/输出 ) 包。轻装上阵表现了C语言的哲学——经济适用资源。
2. main() 函数
main( ) 函数是整个可执行程序的入口。
其基本的格式和函数的名字是固定的,例如,
int main(void)
{}
其中int 类型表示函数的返回值类型;
main 是函数的名字;
函数名后的圆括号表示参数列表;
花括号表示 main 函数的功能代码块。
3. 注释
注释有两种风格
/* 这是一条C 注释 */// 这是一条 C注释
写注释能让他人 ( 包括自己 ) 更容易明白你所写的程序。
4. 花括号、函数体和块
所有的C函数都是用花括号标记函数体的开始和结束。
5. 声明
int num;
声明 ( declaration ) 完成了两件事,
其一,在函数中有一个名为 num 的变量 ( variable ) 。
其二,int 表明 num 是一个整数 ( 即,没有小数点或小数部分的数 ) 。
int 是 C 语言中的一个关键字 ( keyword ) ,表示一种基本的 C 语言数据类型,不能做其他用途。
num 是一个标识符 ( identifier ) ,也就是一个变量、函数或其他实体的名称。
在C语言中,所有的变量都必须先声明才能使用。
以前的C语言,还要求把变量声明在块的顶部,其他语句不能出现在任何声明的前面。
C99 和 C11 遵循 C++ 的惯例,可以把声明放在块中的任何位置。
(1). 数据类型
C 语言可以处理多种类型的数据。如整数、字符和浮点型。
把变量声明为整形或者字符类型,计算机才能正确地存储、读取和解释数据。
(2). 命名
给变量命名时要使用有意义的变量名或标识符,如变量名无法清除地表达自身的用途,可在注释中进一步说明。
C99 和 C11 允许使用更长的标识符名,但编译器只识别前63个字符。
可以用小写字母、大写字母、数字和下划线 ( _ ) 来命名。名称的第1个字符必须是字母或下划线,不能是数字。
操作系统和 C 库经常使用以一个或两个下划线字符开始的标识符 ( 如,_kcab ) ,因此最好避免在自己的程序中使用这种名称。
(3). 声明变量的4个理由
- 把所有的变量放在一起,方便读者查找和理解程序的用途。
- 声明变量会促使你在编写程序之前做一些计划。
- 声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误。
- 如果事先未声明变量,C 程序将无法通过编译。
6. 赋值
赋值表达式语句是C语言的基本操作之一。
在声明时,编译器在计算机内存中未变量 num 预留了空间,然后在赋值时,把值存储在之前预留的位置。
可以赋不同的值,这就是其被称为 变量 ( variable ) 的原因。
注意,赋值表达式语句从右侧把值赋给左侧,以分号结尾。
7. printf() 函数
圆括号表明 printf 是一个函数名。圆括号中的内容是从 main() 函数中传递给 printf() 函数的信息。该信息被称为参数 ,更准确地说,是函数的实际参数 ( actual argument ) 。
实际参数 ( 简称实参 ) 时传递给函数的特定值,形式参数 ( 简称形参 ) 是函数中用于存储值的变量。
该函数会查看双引号中的内容,并将其打印在屏幕上。
\n 是换行的意思,\n 组合代表一个换行符 ( newline character ) ,其是一个转义序列 ( escape sequence ) ,用来代表难以表示或者难以输入的字符。
如,\t 代表Tab键,\b 代表Backspace键 ( 退格键 )。
%d 相当于是一个占位符,其作用是指明输出 num 的位置。
% 提醒程序,要在该处打印一个变量,d 表明把表面光作为十进制整数打印。
printf() 中的 f 提醒用户,这是一种格式化打印函数 ( 如小数和十六进制整数等 ) 。
8. return 语句
return 语句是最后一条语句,是一种跳转语句,int main(void) 中的 int 表明 main() 函数应返回一个整数。
有返回值的 C 函数要有 return 语句。该语句以 return 关键字开始,后面是待返回的值,并以分号结尾。
可以省略 main() 函数末尾的 return 语句,程序在运行至最外面的右花括号 ( } ) 时会返回 0 。
但是,建议在 main() 函数中保留 return 语句的好习惯。
三. 简单程序的结构
程序由一个或多个函数组成,必须由 main() 函数。
函数由函数头和函数体组成。
函数头包括函数名、传入该函数的信息类型和函数的返回类型。
四. 提高程序可读性的技巧
- 选择有意义的函数名
- 写注释
- 在函数中用空行分割概念上的多个部分
- 每条语句各占一行
五. 进一步使用C
程序清单2.2 fathm_ft.c程序
// fathm_ft.c -- 把2英寻转换成英尺(1 英寻 = 6 英尺 = 1.8 米)
#include <stdio.h>
int main(void)
{int feet, fathoms;fathoms = 2;feet = 6 * fathoms;printf("There are %d feet in %d fathoms!\n", feet, fathoms);printf("Yes, I said %d feet!\n", 6 * fathoms);return 0;
}
(一). 程序说明
注释给出了文件名和程序的目的,很简单又不费时。
(二). 多条声明
在一条声明中声明两个变量 ( 及以上 ) 时,要用逗号隔开两个变量。
(三). 乘法
用 * 表示乘法,程序中的含义是“查找变量 fathoms 的值,用 6 乘以该值,并把计算结果赋给变量 feet”。
(四). 打印多个值
待输出的变量列于双引号的后面,变量之间要用逗号隔开。
六. 多个函数
程序清单2.3 two_func.c程序
//* two_func.c -- 一个文件中包含两个函数 */
#include <stdio.h>
void butler(void); /* ANSI/ISO C 函数原型 */
int main(void)
{printf("I will summon the butler function.\n");butler();printf("Yes. Bring me some tea and writeable DVDs.\n");return 0;
}void butler(void) /* 函数定义开始 */
{printf("You rang, sir?\n");
}
butler() 函数出现了3次。
第一次是函数原型 ( prototype ) ,告知编译器在程序中要使用该函数。
第二次是以函数调用 ( function call ) 的形式出现在 main() 中。
最后一次出现在函数定义 ( function definition ) 中,函数定义即是函数本身的源代码。
这里要注意,执行函数取决于它在 main() 中被调用的位置,而不是函数定义在文件中的位置。
七. 调试程序
程序的错误通常叫做 bug ,找出并修正错误的过程叫做调试 ( debug ) 。
(一). 语法错误
编程中代码没有遵循 C 语言的语法规范而造成的错误。
例如,标识符命名不符合规范、错误的类型赋值操作等。
语法错误是比较常见的错误,编译器也能够较好地识别这类错误,并且在编译过程中给出错误提示,错误提示一般会标识出存在错误的语句所在的行号。
(二). 语意错误
在很多时候也称为逻辑错误,存在这一类错误的语句在语法上是正确的,但是其表达的含义和逻辑关系存在错误。
例如,“一年有 366 天”这句话在语法止是正确的,但是在逻辑上存在错误。
因此,编译器基本上很难检查出语义错误,在根据程序的功能目标设计完程序后,需进行程序测试以发现这种错误。
(三). 程序状态
程序状态 ( program state ) 是在程序的执行过程中,某给定点上所有变量值的集合。
检测程序状态的方法:
- 自己模拟计算机逐步执行程序
- 在程序中的关键点插入额外的 printf() 语句,以监视指定变量值的变化。
- 使用调试器 ( debugger )。
八. 关键字和保留标识符
粗体表示的是 C90 标准新增的关键字,斜体表示的 C99 标准新增的关键字,粗斜体表示的是 C11 标准新增的关键字
表2.1 ISO C 关键字
auto | extern | short | while |
break | float | signed | _Alignas |
case | for | sizeof | _Alignof |
char | goto | static | _Atomic |
const | if | struct | _Bool |
continue | inline | switch | _Complex |
default | int | typedef | _Generic |
do | long | union | _Imaginary |
double | register | unsigned | _Noreturn |
else | restrict | void | _Static_assert |
enum | return | volatile | _Thread_local |
如果使用关键字不当 ( 如,用关键字作为变量名 ),编译器会将其视为语法错误。
还有一些保留标识符 ( reserved indentifier ) ,C 语言已经指定了它们的用途或保留它们使用权,如果你使用这些标识符来表示其他意思会导致一些问题。
九. 关键概念
几乎正确仍然是错误
十. 本章小结
C 语言由一个或多个 C 函数组成。
每个 C 程序必须包含一个 main() 函数,这是 C 程序要调用的第一个函数。
简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。
在 C语言中,大部分语句都以分号结尾。
声明语句为变量指定变量名,并标识该变量中存储的数据类型。变量名是一种标识符。
赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间。
函数表达式语句用于调用指定的已命名函数。调用函数执行完毕后,程序会返回到函数调用后面的语句继续执行。
printf() 函数用于输出想要表达的内容和变量的值。
一门语言的语法是一套规则,用于管理语言中各有效语句组合在一起的方式。
语句的语义是语句要表达的意思。
编译器可以检测出语法错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。
检查程序是否有语义错误要跟踪程序的状态,即检查程序每执行一步后所有变量的值。
最后,关键字是C语言的词汇。
十一. 复习题
1. C 语言的基本模块是什么?
它们都叫做函数。
2. 什么是语法错误?
语法错误违反了组成语句或程序的规则。
3. 什么是语义错误?
语义错误是指含义错误。
4. Indiana Sloth 编写了下面的程序,并征求你的意见,请帮助他评定。
include studio.h //#include <stdio.h>
int main{void} /* 该程序打印一年有多少周 /* //int main(void) /* 该程序打印一年有多少周 */
( //{int s // int s;--> //s := 56; // s = 52;printf(There are s weeks in a year.); // printf("There are %d weeks in a year.\n",s);return 0; // return 0;//}
5. 假设下面的 4 个例子都是完整程序中的一部分,它们分别输出什么结果?
a.printf("Baa Baa Black Sheep."); //a.Baa Baa Black Sheep.Have you any wool?printf("Have you any wool?\n"); //
b.printf("Begone!\nO creature of lard!\n"); //b.Begone!
c.printf("What?\nNo/nfish?\n"); // O creature of lard!
d.int num; //c.What?num = 2; // No/nfish?printf("%d + %d = %d", num , num , num + num ); //d.2 + 2 = 4
6. 在main、int、function、char、=中,哪些是 C语言的关键字?
int 和 char 是关键字。
main 是一个函数名,function 是函数的意思,= 是一个运算符。
7. 如何以下面的格式输出变量 words 和 lines 的值(这里,3020 和350代表两个变量的值)。There were 3020 words and 350 lines.
printf("There were %d words and %d lines.",words,lines)
8. 考虑下面的程序。请问,在执行完第 7 行、第 8 行、第9 行后,程序的状态分别是什么?
#include <stdio.h>
int main(void)
{int a,b;a = 5;b = 2;/* 第7行 */ //执行完第7行,a=5,b=2b = a;/* 第8行 */ //执行完第8行,a=5,b=5a = b;/* 第9行 */ //执行完第9行,a=5,b=5printf("%d %d\n",b,a);return 0;
}
9. 考虑下面的程序。请问,在执行完第 7 行、第 8 行、第9 行后,程序的状态分别是什么?
#include <stdio.h>
int main(void)
{int x,y;x = 10;y = 5;/* 第7行 */ //执行完第7行,x=10,y=5y = x +y;/* 第8行 */ //执行完第8行,x=10,y=15x = x*y;/* 第9行 */ //执行完第9行,x=150,y=15printf("%d %d\n",x,y);return 0;
}
十二. 编程练习
1. 打印 Gustav Mahler 的名和姓。
#include <stdio.h>
int main(void)
{printf("Gustav Mahler\n");printf("Gustav \nMahler\n");printf("Gustav ");printf("Mahler\n");return 0;
}
2. 打印你的姓名和电话。
#include <stdio.h>
int main(void)
{printf("名字:你的名字\n");printf("地址:你的地址\n");return 0;
}
3. 把你的年龄转换成天数,并显示这两个值。不考虑闰年。
#include <stdio.h>
int main(void)
{int age = 25;int days = 0;days = age * 365;printf("年龄:%d\n", age);printf("天数:%d\n", days);return 0;
}
4. 调用两个自定义函数:jolly() 打印一遍 “For he’s a jolly good fellow!”,调用三次,deny() 打印 “Which nobody can deny!”
#include <stdio.h>
void jolly(void);
void deny(void);
int main(void)
{jolly();jolly();jolly();deny();return 0;
}
void jolly(void)
{printf("For he's a jolly good fellow!\n");
}
void deny(void)
{printf("Which nobody can deny!\n");
}
5. 调用两个自定义函数:br() 打印一遍 “Brazil,Russia”,ic() 打印一遍 “India,China”
#include <stdio.h>
void br(void);
void ic(void);
int main(void)
{br();printf(",");ic();printf("\n");ic();printf("\n");br();return 0;
}
void br(void)
{printf("Brazil,Russia");
}
void ic(void)
{printf("India,China");
}
6. 创建一个整型变量 toes ,并将 toes 设置为 10 。程序中要计算 toes 的两倍和 toes 的平方,并打印三个值。
#include <stdio.h>
int main(void)
{int toes = 10;printf("toes为:%d\ntoes的两倍为:%d\ntoes的平方为:%d\n", toes, toes * 2, toes * toes);return 0;
}
7. 定义一个函数,被调用一次打印一次“Smile!”。
#include <stdio.h>
void smile(void);
int main(void)
{smile();smile();smile();printf("\n");smile();smile();printf("\n");smile();return 0;
}
void smile(void)
{printf("Smile!");
}
8. 编写一个程序,用于调用一个名为one_three()函数,该函数在一行打印“One”,再调用另一个函数 two(),然后在另一行打印单词“three”。two()函数在一行显示单词“two”。main()函数在调用 one_three()函数前要打印短语“Staring now:”,并在调用完毕后显示短语“done!”。
#include <stdio.h>
void one_three(void);
void two(void);
int main(void)
{printf("Staring now:\n");one_three();printf("done!\n");return 0;
}
void one_three(void)
{printf("One\n");two();printf("three\n");
}
void two(void)
{printf("two\n");
}
C语言入门——C语言概述相关推荐
- R语言入门1---R语言介绍以及学前注意事项
R语言是从贝尔实验室的S语言演变而来的,基于S语言开发的商业软件Splus,可以方便的编写函数.建立模型,具有良好的扩展性,取得了巨大成功.1995年由新西兰Auckland大学统计系的Robert ...
- python语言入门pdf-python语言入门
python语言入门高清版是一本对python入门初学者的一本参考学习图书,该书详细的概述了Python语言的基本特点,讲解透彻好懂,有需要的来下载吧! 一款很不错的Python初学者使用书籍 pyt ...
- 王建伟c语言入门,C语言【共43课时】_C/C++/C#课程-51CTO学院
第1章 c/c++起源.市场需求.开发环境搭建 24分钟1节 1-1 c/c++起源.市场需求.开发环境搭建 作为c语言入门的第一节课,老师首先强调了学好一门计算机语言的三个最关键要素,同时做了自我介 ...
- python语言入门pdf-Python语言入门.pdf
本书是国内第一本讲述Python语言的图书.Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序.快速脚本和复杂应用的原型.作为一种开源软件,Python可以自由获取,而且非常易学易 ...
- python语言入门n-python语言入门之字符串的一些用法
本篇教程探讨了python语言入门之字符串的一些用法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 一.字符串的拼接: a="123' b="ab ...
- python语言入门m-Python语言入门详解!快速学成Python!
今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...
- R语言入门4---R语言流程控制
流程控制语句在任何语言中都是非常重要的,通过流程控制语句编程者能够根据业务逻辑在程序中设计合理的循环.分支,实现程序各种各样强大的功能.一般实现任一算法的控制结构都可以分为顺序结构.分支结构.循环 ...
- python语言入门-Python语言入门详解!快速学成Python!
原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...
- python语言入门-Python语言入门.pdf
本书是国内第一本讲述Python语言的图书.Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序.快速脚本和复杂应用的原型.作为一种开源软件,Python可以自由获取,而且非常易学易 ...
最新文章
- mysql元数据死锁日志_这个未修复的MySQL 5.7死锁Bug,你知道么?
- 重磅!我国建成首个自动驾驶封闭高速公路测试环境
- SQLite可视化管理工具汇总
- distribution counting—a sorting method from aocp
- linux系统安装文网卫士,360主机卫士 Linux 版本 安装
- mPaaS 客户端问题排查之突如其来的“白屏”等待
- getResource(String name)用法及源码分析
- 湖南工业大学c语言在线作业答案,湖南工业大学C语言期末考试复习题(机房题库)...
- 华三防火墙配置端口地址转换_H3C防火墙配置命令
- stm32f103c8t6视频教程
- 一些有关MATLAB使用的基础习题
- python期货基本面分析_Python股票期货交易利器,砖型图详细绘制教程!
- Revit二次开发入门秘籍 01如何入门
- Qt进阶--Item Views详解(基础,原创,超级详细)
- (一)Deep learning论文纯翻译
- 首师大附中科创教育平台 我的刷题记录 0325 50212228海岛帝国:LYF的太空运输站...
- 如何正确理解C语言的文件
- 《信号与系统》笔记·第一章:信号与系统
- VUE+TS+animate 踩的坑和基础使用方式
- only office基于dockers部署
热门文章
- matlab中minigrid,[转载][转载]matlab画地图的工具:worldmap和m_map
- Java进阶(一)面向对象进阶简介
- 谷歌无法打开微信二维码链接解决方案 之 使用谷歌模拟微信浏览器
- 马王堆汉墓帛书‧老子——乙本释文(德经)
- php框架laravel win10,composer 安装Laravel (win10)
- C语言——计算单词个数
- oracle误删了表怎么恢复数据,oracle误删除表或者表数据的恢复方法总结
- Word文档编辑受限解决办法
- 【基础】603- 深入分析Session和Cookie
- 基于Java的地理位置定位系统