一起啃书(C Primer Plus 第六版)--C语言概述<附大量编程题>

373 阅读7分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

本来学JAVA学着学着听不懂什么叫空指针异常

上网上看感觉还是不够系统,趁着国庆重温C语言的经典C Primer Plus

这本书写的真的很细致,需要慢慢去消化吸收

纸上得来终觉浅,绝知此事要躬行

这句话看了好几遍了,我也写上去,很适合编程方向的学习

好了,开始啃书了

资源在这

Screenshot_20211001_171431_com.tencent.mm.jpg

一、简单的C程序

/*
一个简单的C程序
*/
#include <stdio.h>
int main(void)
{
    int num;
    num = 1;

    printf("I am a simple ");
    printf("computer.\n");
    printf("My favorite number is %d because it is first.\n",num);

    return 0;
}

1.快速概要

这一节先简单介绍一下作用,后面会详细讨论

#include <stdio.h> 包含另一个文件

int main(void) 函数名

/* ....*/ 注释

{ 函数体开始

int num 声明一个num变量

num = 1赋值表达式语句,把值1赋给名为num的变量

printf("I am a simple "); 调用一个函数

printf("computer.\n"); 调用另一个函数,在上一条语句后面加上computer并换行,\n的作用是换行

printf("My favorite number is %d because it is first.\n",num); 这个printf函数是把num的值嵌套在双引号中和内容一起打印,%d告诉计算机以何种形式输出num的值

return 0; 可以先看作是结束main函数的作用

} 表示程序的结束

2.程序细节

(1)#include指令和头文件

#include <stdio.h>

#include这行代码是一条C预处理指令(preprocessor directive),什么是预处理?就是C编译器在编译之前会对源码进行一些准备工作,即预处理

stdio.h文件。这个包含许多供编译器使用的输入输出函数(printf())该文件。通常在C程序顶部的信息被称为头文件

为什么不内置输入输出函数在语言中,还要每次导入stdio.h文件?

原因之一是,并非所有的程序都会用到I/O(输入输出)包,轻装上阵是C语言的哲学

(2)main()函数

int main(void)

C程序一定从main()开始执行,除了main函数其他函数可以随便命名,main()

int是main()函数的返回值类型。这表明main()函数返回的值是整数,返回到操作系统

通常,函数后面的圆括号中包含一些传入函数的信息。这个例子没有传递任何信息。因此是单词void

没错上面的就算标准形式

不要这样写int main() ,void main()

(3)注释

/* 一个简单的C程序 */

注释可以卸载任何地方,在注释之间的会被编译器忽略

还有单行注释

//我是单行注释

C++,Java都是一样的方式,C++还没学过,Java的确是这样的哈哈哈

(4)花括号、函数体和块

{

​ ...

}

所有C函数都用花括号标记函数的开始和结束

(5)声明

int num;

在上面的例子中,声明完成了两件事,第一是在函数中有个名为num的变量,第二是int表名num是一个整数

int是关键字

num是标识符,也就是一个变量,函数或其他实体的名称。因此声明把特点标识符与计算机内存中的特点位置联系起来,同时确定了存储在某位置的信息类型或数据类型

C语言中所有的变量必须先声明才能使用。

int main(void) //旧规则
{
    int doors;
    int dogs;
    doors = 5;
    dogs = 3;
    //其他语句
    return 0;
}
int main(void) //新规则
{
    int doors;
    doors = 5;
    int dogs;
    dogs = 3;
    //其他语句
    return 0;
}

(6)赋值

num = 1;

把值1赋值给num,不是num = 1,该表达式语句从右侧把值赋到左侧

(7)printf()函数

printf("I am a simple ");
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);

圆括号表名printf是一个函数名。圆括号中的内容是参数,是实际参数,也就是确切的值

那么形式参数就是函数中用于存储值变量

这个函数可以将括号内的内容打印到屏幕上

(8)return语句

return 0;

可以理解为代码规范,在后面会i详细解释用途

3.程序规范

函数头和函数体

image.png

见名知意

使用空行,一条语句一行

写注释

4.多个函数

#include <stdio.h>
void buttler(void); //函数原型
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");
}

该程序输入如下:
I will summon the butler function.
You rang,sir?
Yes,Bring me some tea and writeable DVDs.

其中butler()函数出现了3次。

第一次是函数原型,作用是告诉编译器要在程序中使用该函数;

第二次调用是函数调用的形式出现在main()中;

最后一次出现在函数定义中,函数定义就是函数本身的源代码

这是因为C的标准建议,要为所有程序中应用到的所有函数提供函数原型。标准include文件为标准库文件提供了函数原型

5.调试程序

(1)语法错误

image.png

编程和数学英语有亲密的联系,学习之余可以多学学英语和数学,提高英文阅读能力和逻辑思维能力

#include <stdio.h>

int main(void)

(

  int n,int n2,int n3;


  /*多行错误

  n=5;

  n2 = n * n;

  n3 = n2 * n2;



  return 0;

)

1、main()函数体用花括号

2、变量的声明应该这样写

int n , n2 ,n3;

int n;

int n2;

int n3;

3、注释有头有尾

(2)语义错误

image.png

n=5;
n2 = n * n;
n3 = n2 * n2;

image.png

程序出错就出现bug,解决bug叫调试程序

6.关键字和保留标识符

就是你不能在起这个名字了,这些词已经被计算机用了

image.png

7.小结

(1)C程序由一个或多个C函数组成。每个C程序必须包含一个main()函数,这是C程序要调用的第一个函数

(2)在C语言中,大部分语句都以分号结尾。

(3)声明为变量创建变量名和标识该变量中储存的数据类型。

(4)变量名是一种标识符。

(5)赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间。

(6)函数表达式语句用于调用指定的已命名函数。调用函数执行完毕后,程序会返回到函数调用后面的语句继续执行。

(7)关键字是C语言的词汇!!!

8.编程练习

纸上得来终觉浅,绝知此事要躬行。

image.png

image.png

image.png

1、

#include <stdio.h>

int main(void)

{

  printf("Gustav Mahler\n");

  printf("Gustav\n");

  printf("Gustav\n");

  printf("Gustav ");

  printf("Mahler");



  return 0;

}

结果:

Gustav Mahler Gustav Gustav Gustav Mahler

这一题还是挺简单的,掌握换行符\n就可以了

2、

#include <stdio.h>

int main(void)

{

  printf("My name is pengyuyan.\n");

  printf("My address is beijing.\n");

  

  return 0;

}

My name is pengyuyan. My address is beijing.

3、

#include <stdio.h>

int main(void)

{

  int age = 21;

  int year = 365;

  int days = age * year;

  printf("Days are %d",days);



  return 0;

}

Days are 7665

4、

#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");

  return;

}



void deny(void)

{

  printf("Which nobody can deny!\n");

  return;

}

For he's a jolly good fellow! For he's a jolly good fellow! For he's a jolly good fellow! Which nobody can deny!

5、

#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");

  return;

}



void ic(void)

{

  printf("India, China");

  return;

}

6、

#include <stdio.h>



int main(void)

{

  int toes = 10;



  printf("toes = %d\n", toes);

  printf("toes * 2 = %d\n", toes * 2);

  toes = toes * toes;

  printf("toes ^ 2 = %d\n", toes);



  return 0;

}

7、

#include <stdio.h>



void smile(void);



int main(void)

{

  smile();

  smile();

  smile();

  printf("\n");

  smile();

  smile();

  printf("\n");

  smile();

  printf("\n");



  return 0;

}



void smile(void)

{

  printf("Smile!");

  return;

}

8、

#include <stdio.h>

void one_three(void);
void two(void);

int main(void)
{
    printf("Starting now:\n");
    one_three();
    printf("Done!\n");

    return 0;

}

void one_three(void)
{
    printf("one\n");
    two();
    printf("three\n");
    return;
}

void two(void)
{
    printf("two\n");
    return;
}