终于换了工作了,我准备开始重新建立自己的计算机知识体系,自底而上的开始充实自己的技术能力。
首先是底层计算机技术,包括计算机原理、操作系统、数据结构。这一切的理论实践,需要以C语言为基础,所以先学C语言。
学习C语言,我使用《C程序设计语言》这本书为起点,全书正文166页,每天一节,用80天学习完。
学习C语言第一天:
第一章 导言,首先是概要的介绍C语言,主要是通过实际的程序引入C语言的基本元素。希望读者能尽快地编写出有用的程序。为此本章主要介绍一些基本概念,比如变量与常量、算术运算、控制流、函数、基本输入输出等。
1.1 入门
学习一门新程序设计语言的惟一途径就是使用它编写程序。对于所有语言的初学者来说,编写的第一个程序几乎都是相同的,即:
请打印出下列内容
hello, world
我们首先必须编写程序文本,然后成功地进行编译,并加载、运行,最后输出到某个地方。
第一个C语言程序
#include <stdio.h> // 包含标准库的信息
main() { // 定义名为main的函数,它不接受参数值
printf("hello, world\n"); // main函数的语句都被括在花括号中,maim函数调用库函数printf以显示字符串序列;\n代表换行符
}
我这里用的是linux系统,自带C语言编译器cc,首先用编译
cc hello.c
如果源程序没有什么错误,就生成a.out文件
运行a.out文件
./a.out
即可打印出
hello, world
程序说明:一个C语言程序,无论其大小如何,都是由函数和变量组成的。函数中包含一些语句,以指定要执行的计算操作;变量则用于存储计算过程中使用的值。每个程序都从main函数的起点开始执行,这意为者每个程序都必须在某个位置包含一个main函数。
main函数通常会调用其他函数来帮助完成某些工作,被调用的函数可以是程序设计人员自己编写的,也可以来自与函数库。上述
#include <stdio>
用于告诉编译器在本程序中包含标准输入/输出库的信息。
函数之间进行数据交换的一种方式是调用函数向被调用函数提供一个值(称为参数)列表。函数名后面的一对圆括号将参数列表括起来。
函数中的语句用一对花括号{}括起来。
printf("hello, world\n")
上面这条语句将“hello, world\n”作为参数调用printf函数。printf是一个用于打印输出的库函数,在此处,它打印双引号中间的字符串。
用双引号括起来的字符序列称为字符串或字符串常量。字符序列\n表示换行符,在打印中遇到它时,输出打印将换行,从下一行左端行首开始。
printf函数永远不会自动换行,这样我们可以多次调用该函数以分阶段得到一个长的输出行。如下:
#include <stdio.h>
main() {
printf("hello, ");
printf("world\n");
printf("\n");
}
练习:
1-1 在你自己的系统中运行“hello, world”程序。再有意去掉程序中的部分内容,看看会得到什么出错信息。
1-2 做个实验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符序列中未曾列出的某一个字符)时,观察一下会出现什么情况。
练习1-1:
1.删除 #include <stdio>报错:
hello.c: 在函数‘main’中:
hello.c:3:5: 警告:隐式声明与内建函数‘printf’不兼容 [默认启用]
printf("hello, world\n");
2.删除main()后面的第一个大括号报错,specifiers(说明符):
hello.c: 在函数‘main’中:
hello.c:3:5: 错误:expected declaration specifiers before ‘printf’
printf("hello, world\n");
^
hello.c:4:1: 错误:expected declaration specifiers before ‘}’ token
}
^
hello.c:4:1: 错误:expected ‘{’ at end of input
编译报错基本上都会把相关的位置和信息显示出来,对应排除修改即可。
练习1-2:
写一个\p,编译报错:
hello.c: 在函数‘main’中:
hello.c:3:12: 警告:未知的转义序列:‘\p’ [默认启用]
printf("hello, world\n\p");