1. Hello World
Hellow world是一个非常著名的小程序,这个世界,几乎每个程序员入门的第一段代码都是Helloworld。原因是当年C语言的作者,DennisRitchie(丹尼斯·里奇)在他的名著《C程序设计语(The C Programming Language)》中第一次引入,传为后世经典,其它语言亦争相效仿,以示致敬。
1.1.源程序
#include <stdio.h> //程序中因为用到了 printf 库函数,所以要包含 printf 所在的头文件
int main() //程序的入口,表示计算机从哪里开始执行此程序,有且,只有一个
{
printf("Hello World!\n"); //调用库函数,向屏幕打印 Hello World!
return 0; // main 函数的返回值
}
1.2.分析hello.c
#include <stdio.h>
stdio.h
包含了标准输出、输入的函数的头文件,在头文件中只声明函数,函数的实现已被系统封装成了.so或.a 库文件。<>
表示系统的头文件(/usr/include
目录下),如果是自定义头文件则使用""
。
如果在一个源文件中,需要使用供它头文件的函数,则需要通过#include
进行包含。
// int 是整数类型,在此表示main()函数返回值的类型
// main() 函数的写法,main代表是主函数,一个程序只能存在 一个主函数,且是程序运行的入口。
// { } 语句块表示,与函数一起使用时,代表是函数体
int main(){
// printf() 打印或输出的函数
// "hello,c!" 是字符串常量表示,在printf()中使用时,表示输出的内容
// 每一条语句结束时,使用 分号;
// printf(""); 此处的; 表示调用函数结束
printf("hello,c!");
// return 函数返回的关键字,语句执行到此,表示函数结束
// 0 整数,表示函数的正常结束
return 0;
}
【注意】 {}
,<>
, #
, ()
, ""
,;
这些符号必须是英文的, 除了""
内部可以是中文之外,其它的地方的符号都是英文状态输入的。
1.3 C语言中的注释
注释只是解释语句的,编译器在编译时,忽略注释信息,以便后期的维护和管理
单行注释:
// 注释的内容
单行注释可以独立一行,也可以在语句结束之后,添加
// 输出
printf("Hello World!\n"); // ;结束
多行注释:
/*
多行
注释
*/
多行注释一般用于函数的说明,放在函数的上方。
/*
* sum 求两个整数的和
* @param a 第一个整数
* @param b 第二个整数
*/
int sum(int a, int b){
return a+b;
}
1.3.从源程序到可执行程序
源程序就是一个.txt 的普通文本文件,是经历了哪些过程,变为可执行性文件的呢?
大体上分为四个步骤:预处理 -> 编译 -> 汇编 -> 链接 四个过程。
1.3.1.集成开发环境:
对于集成开发环境(IDE,Integrated Development Environment )而言,减少了环境配置,合并了流程,使其便于快速开发。就 Qt 开发环境而言,只需一步即可:
1.3.2.手动编译:
2. C 语言与自然语言
2.1.语法规则
计算机语言的语法规则是为了定义一种在计算机上运行的语言,它模仿了自然语言和数学语言的特点。通过遵守这些规则,我们可以更容易地学习和使用这门语言。
就像学习一门新的自然语言或数学语言一样,了解和理解计算机语言的语法规则非常重要。这些规则告诉我们如何正确地组织代码,如何使用不同的语法元素,以及如何表达特定的意思。
语法规则是一种结构化的规范,它定义了编程语言中各种元素(例如变量、函数、语句等)的正确用法和组合方式。这些规则包括关键字的使用、标识符的命名规范、语句的结束方式、运算符的优先级等等。
通过熟悉和理解语法规则,我们可以编写出符合语言规范的代码,从而让计算机正确地执行我们的指令。如果我们违反了语法规则,编译器或解释器就会提示错误,我们需要修正错误才能使程序正常运行。
2.2.程序与流程
2.2.1.程序
程序是一种描述完成特定任务的操作序列或过程的方式。我们可以将程序视为按照特定的步骤和顺序执行一系列动作来达到某个目标。
在日常生活中,我们经常会遇到需要按照一定顺序执行的任务,比如烹饪食物、组装家具或者洗衣服等。对于每个任务,我们都需要按照一定的步骤来完成,这些步骤的组合形成了一个完整的程序。
类比到计算机领域,程序也是一种按照特定顺序执行的操作序列。计算机程序由一系列指令组成,每条指令告诉计算机要进行的具体操作,比如执行某种计算、读取或写入数据、判断条件等等。通过按照程序中定义的顺序逐条执行这些指令,计算机可以完成特定的任务。
编写程序的过程就是将我们想要实现的功能或解决的问题转化为计算机可以理解和执行的指令序列。我们需要使用特定的编程语言来描述这些指令,并按照语言的语法规则组织和编排它们。通过正确编写程序,我们可以让计算机按照我们的意图执行特定的任务。
2.2.2.流程和流程图
2.2.2.1.流程即算法
算法:
它是解决问题的具体方法和步骤的描述。对于一个特定的问题,我们可以设计一个算法来指导计算机按照一定的流程执行操作,从而达到我们期望的结果。
举个例子来说,假设我们要计算一个长方形的面积。我们可以使用自然语言来描述这个算法的步骤:
-
接收用户输入的长方形的长度和宽度两个值;
-
判断长度和宽度的值是否大于零;
-
如果长度和宽度的值都大于零,那么将长度和宽度两个值相乘,得到长方形的面积;
-
否则,显示输入错误的提示信息;
-
最后,将计算得到的面积显示出来。
这个算法描述了解决计算长方形面积的步骤,它按照特定的流程进行操作。我们可以将这个算法转化为计算机可以执行的程序代码,使用特定的编程语言来实现。
2.2.2.2.流程图
流程图是一种图形化的表示方法,用于描述算法或程序的流程。使得算法的流程更加清晰可视化。通过绘制流程图,我们可以更好地理解和分析算法的结构和逻辑。
它使用一组预定义的符号来说明如何执行特定任务。
3. C语言中的关键字
学习关键字的目的是了解存在哪些关键字,另外,在定义变量名、函数名(标识符命名)避免使用关键字。
3.1 数据类型相关的关键字
char 字符类型, 占1个字节, ASCII表有128字符,每个字符占1个字节。
short 短整型,占2个字节
int 整型, 占4个字节
long 长整型,32位机占 4B, 64位机占 8B
float 浮点型(单精度) 占 4B
double 浮点型(双精度) 占 8B
unsigned 无符号 (数据二进制表示的最高位是数据位)
signed 有符号 (数据二进制表示的最高位是符号, 0正, 1负)
void 无类型(任意类型)
struct 结构体
union 共用体
enum 枚举
3.3.2 存储相关的关键字
register 寄存器存储变量(建议编译器)
static 静态存储变量(多线程中应用较多)
const 只读变量
auto 自动变量(接收某一个函数的返回值, 自动确认变量的数据类型)
extern 声明变量或函数时使用
#include <stdio.h>
// 声明函数
extern int sum(int,int);
int main(){
int ret = sum(100, 200);
printf("100+200=%d \n", ret);
return 0;
}
int sum(int a, int b){
return a+b;
}
3.3.3 流程控制相关的关键字
分支相关:
if, else
switch, case, default, break;
goto
循环相关:
for
while, do
break
continue
3.3.4 其它关键字
sizeof() 计算变量的所占内存空间大小的,返回是字节单位
typedef 类型重命名名, 如size_t => typedef unsigned long size_t;
volatile 防止编译器优化,声明变量是存储在内存中。
如:为unsigned int 重命名为 uint32, 并尝试通过新的类型名变量一个变量,并打印变量的数值和所占内存的字节大小。
#include <stdio.h>
typedef unsigned int uint32; // 无符号整数
int main(){
uint32 n=20;
// \n 换行的转义
printf("n=%d, n size is %d \n", n, sizeof(n));
return 0;
}
如果在编译时出现了 warning
, 两种做法可以去除警告。
1. 按照 警告的提示,修改代码
2. 编译时,添加去除警告的参数 ,依据警告提示中的[]内容,在-W后加no-
第一种方式:修改代码如下
#include <stdio.h>
typedef unsigned int uint32; // 无符号整数
int main(){
uint32 n=20;
// \n 换行的转义
// %d 整数类型, %ld 长整型
printf("n=%d, n size is %ldB \n", n, sizeof(n));
return 0;
}
第二种方式:原代码不变,gcc编译时添加选项 gcc datatype.c -Wno-format
更多内容和学习资料,敬请关注微信公众号: