C语言基础语法学习笔记(一)

发布时间 2023-09-20 23:10:40作者: Ransang

前言

C语言是大学时期入门编程的第一门编程语言,遗憾的是当时没好好学,这么多年过去了也没有真正的学习和使用过这门优秀的编程语言,现如今正好有时间就打算从头开始好好学一下。学习的参考资料主要是《C语言程序设计》这本书以及benny老师的C语言精讲视频课。

快速入门

快速入门部分会通过一些简单的程序代码来熟悉C语言中的一些语法和概念,书里说快速学习一门新语言的惟一途径就是使用它编写程序,那我们就开始吧。

入门

任何编程语言的入门都少不了“HelloWorld”:

#include <stdio.h>
main()
{
  printf("Hello world\n");
}

运行程序将在控制台打印出“Hello world”并换行。

#include <stdio.h>

第一行代码是一个预处理指令,用于告诉编译器在本程序中包含标准输入/输出库的信息。预处理指令又叫做宏,先简单看图了解下C语言的编译过程:

main函数这块有编程基础的应该都能看懂,毕竟C语言作为其他高级语言的爷爷辈,很多语言的语法直接就来自于C。

变量与算术表达式

先来看下书上的一个程序,使用公式°C=(5/9)(°F-32)打印下列华氏温度与摄氏温度对照表:
1 -17
20 -6
40 4
60 15
80 26
100 37
120 48
140 60
160 71
180 82
200 93
220 104
240 115
260 126
280 137
300 148

程序代码如下:

#include <stdio.h>

 /* 当 fahr=0,20,... ,300 时,分别
 打印华氏温度与摄氏温度对照表 */
 main()
{
 int fahr, celsius;
 int lower, upper, step;
 lower = 0; /* 温度表的下限 */
 upper = 300; /* 温度表的上限 */
 step = 20; /* 步长 */
 fahr = lower;
 while (fahr <= upper) {
    celsius = 5 * (fahr-32) / 9; 
    printf("%d\t%d\n", fahr, celsius); 
    fahr = fahr + step;
  }
 }

这段程序相比helloworld看起来要复杂了很多,相同之处是都以一个预处理指令开头,都包含一个main函数。
从函数体的代码我们可以了解到C语言的注释、变量定义、变量赋值、进行算术运算、以及while循环的使用方法。值得注意的是printf里的“%d\t%d\n”,printf是一个输出格式化函数,该函数的第一个参数是待打印的字符串,其中的每个百分号(%) 表示其它的参数(第二个、第三个、......参数)之一进行替换的位置,%后面的d就是指定打印格式,%d代表整型参数。这句代码用于打印两个整数 fahr 与 celsius 的值,并在两者之间留一个制表符的空间(\t),然后进行换行(\n)。
除了%d,还有%f打印浮点数、%3.0f表示打印3个字符宽的浮点数且不包含小数位、%.1f表示小数点后有一位的浮点数、%o打印八进制数、%x十六进制、%c打印字符、%s打印字符串、%%则表示%自身。

for循环语句

上一节中的while循环也可以改写成for循环:

 /* 当 fahr=0,20,... ,300 时,分别
 打印华氏温度与摄氏温度对照表 */
 main()
{
 int fahr, celsius;
 int lower, upper, step;
 lower = 0; /* 温度表的下限 */
 upper = 300; /* 温度表的上限 */
 step = 20; /* 步长 */
 for (fahr = lower; fahr <= upper; fahr = fahr + step) {
    celsius = 5 * (fahr-32) / 9; 
    printf("%d\t%d\n", fahr, celsius); 
  }
 }

或者也可以将整个程序改写成一个for循环:

#include <stdio.h> /*打印华氏温度—摄氏温度对照表*/
main()
{
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20) {
  //使用浮点数使运算更加精确
  printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
  }
}

相比之前的代码只定义了一个变量就完成的所有功能,是不是很酷。

常量

在之前的程序中直接使用300、20等数字并不是一个好习惯,这些又被称为“魔法数”,在C语言中我们可以使用宏来定义这种常量,前面我们见过#include,定义常量则可以使用#define,比如

//常量一般用大写命名 
#define UPPER 300
#define STEP 20
#define RED 0xFF0000
#define GREEN 0x00FF00
#define BLUE 0x0000FF

在编译之前预处理器会将常量名替换成后面的值,注意句末没有分号,也可以取消宏定义的常量,使用#undef,例如

#undef RED

取消定义后就不能在程序中使用了,否则会报错,相当于限定了一个作用域。

字符输入/输出

C标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar 和 putchar 两个函数。每次调用时,getchar 函数从文本流中读入下一个输入字符,并将其作为结果值返回,putchar则打印一个字符。

#include <stdio.h>
/* copy input to output; 1st version */ 
main()
{
  int c;
  c = getchar(); 
  while (c != EOF) {
    putchar(c);
    c = getchar(); 
  }
}

上面是一个简单的从控制台输入一个字符,按回车后会打印刚刚输入的字符的程序,while循环读到EOF(end of file)结束循环,EOF就代表输入或文件的结束。
我们再来看一个单词计数的程序:

#include <stdio.h>
#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */ 
main()
{
    int c, nl, nw, nc, state;
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw; }
    }
    printf("%d %d %d\n", nl, nw, nc); 
}