Linux C学习笔记——C语言基础

本文为清华大学出版社出版的《Linux C从入门到精通》一书的学习笔记,在此感谢作者及相关人员。本文为原创学习笔记,转载请注明出处,谢谢。


2.1 C语言概述

2.1.1 C语言的特点

1) 高效性:C语言生成目标代码的质量高,程序执行效率高,并且具有有好的可读性和编写性。一般情况下,C语言生成的目标代码执行效率只比汇编程序地10%~20%。

2) 灵活性

3) 功能丰富

4) 表达力强

5) 移植性好

2.2 数据类型

2.2.1 基本类型

基本类型是指其值不可以再分解为其他类型。基本类型包括整型、字符型、实型(浮点型)和枚举类型。

1)整形数据:包括基本整型、短整型和长整型(关于整型变量所占字节数的问题,会进行专题研究)。以上三种数据又包括有符号和无符号两类。

2)实型数据:保罗单精度型(float)、双精度型(double)和长双精度型(long double)3种。有十进制小数形式(12.9)和指数形式(314.0697e2)。

3)字符型数据

4)枚举型数据:

① 声明枚举类型用关键字enum开头,例如:enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};可以使用这个枚举类型定义变量,例如:enum week a, b;

② 枚举类型中的Monday, Tuesday等,称之为枚举元素或枚举常量。他们只是一个用户用来定义的标识符。它们既然是常量,就不可以对他们进行赋值操作,例如,Monday = 2;是错误的。

③ C语言编译过程中按照定义的顺序已经为枚举常量定义类值,他们的值为0,1,2,……

④ 枚举常量的值可以用来作比较

⑤ 一个整数不能直接赋给一个枚举常量。

2.2.2 构造类型

一个构造类型可以分解成若干个“成员”和“元素”。每个“成员”都是一个基本数据类型或者一个构造类型。构造类型可以有一下三种:

1) 数组类型

2) 结构体类型

3) 共用体类型

所谓共用体类型,就是几个不同的变量共同占用一段内存的结构类型。共用体类型的变量所占的内存长度等于最长的成员长度。由于共用体类型中的成员是相互覆盖的,因此在使用共用体类型的数据时,有以下几点需要注意:

① 在共用体类型变量所在的内存段中,可以用来存放几种不同类型的成员,但是由于每一个成员的起始地址都是相同的,所以一次只能存放其中一个类型的成员,也就是每一次只有一个成员起作用,其他成员不能同时存在和起作用。

② 当使用共用体类型的变量引用其成员并为该成员赋值时,最后一次赋值的成员是有效的,在存入一个新的成员信息后,原有的成员信息就被覆盖,失去了作用。

③ 整个共用体类型的起始地址与哥哥成员的起始地址是同一个地址。

④ 关于共用体类型的变量,不能为其赋值,不能在定义共用体变量时对其初始化,也不能引用共用体变量名得到一个值。

⑤ 共用体类型的变量不可以作为函数的参数传递,也不能使函数带回共用体变量,但是可以使用指向共用体的指针变量。

⑥ 共用体类型可以出现在结构体定义中,也可以定义共用体类型数组。反之也成立。

2.2.3 指针类型

2.2.4 空类型

2.3 运算符和表达式

2.3.1 运算符

2.3.2 表达式

2.4 函数

2.5 程序语句

2.5.1 控制语句

1)条件控制语句

2)for循环控制语句

3)while循环控制语句

4)do...while循环控制语句

5)swithc多分支选择语句

6)continux语句

7)break语句

8)goto语句

9)return语句

2.5.2 函数调用语句

2.5.3 表达式语句

2.5.4 空语句

2.5.5 复合语句

2.6 预处理命令

2.6.1 宏定义

Macro),是一种批量批量处理的称谓。

计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。

所谓宏定义是指一个指定的标识符来代表一个字符串,在程序中用这个指定的标识符替换所有的字符串。宏定义又分为无参宏好带参宏定义。

1)无参宏定义:#define 标识符 字符串

2)带参宏定义:#MAX(A,B) A<B?B:A

3)操作符#:在使用#define定义宏时,可以使用操作符#在字符串中输出实参。例如:#define AREA(x, y) printf("长为"#x",宽为"#y"的长方形面积:%d\n",(x)*(y)); 

4)操作符##: 与操作符#类似,操作符##也可用在带参宏中替换部分内容。该操作符将宏中的两个部分连接成一个内容。例如,定义如下宏:#define VAR(n)   v##n,当使用一下方式引用宏:VAR(1),预处理时,将得到以下形式:V1,如果使用以下宏定义:#define FUNC(n)  oper##n,当实参为1时,预处理后得到一下形式:oper1

2.6.2 文件包含

#include "头文件名"

#include <头文件名>

2.6.3 条件编译

预处理器还提供了条件编译功能。在预处理时,按照不同的条件去编译程序的不同部分,从而得到不同的目标代码。使用条件编译,可方便地处理程序的调试版本和正式版本,也可使用条件编译使程序的移植更方便。

1)使用#if

#if 常量表达式 1

    程序段 1

#elif 常量表达式 2

    程序段 2

… …

#elif 常量表达式 n

    程序段 n

#else

    程序段 m

#endif

2)使用#ifdef和#ifndef

与#ifdef类似的,可以在#if命令中使用define来判断是否已定义指定的标识符。例如:
#if defined 标识符
程序段 1  

#endif

与下面的标示方式意义相同。
#ifdef 标识符
    程序段 1

#endif

也可使用逻辑运算符,对defined取反。例如:
#if ! define 标识符
    程序段 1

#endif

与下面的标示方式意义相同。
#ifndef 标识符
    程序段 1

#endif

在#ifdef和#ifndef命令后面的标识符是使用#define进行定义的。在程序中,还可以使用#undef取消对标识符的定义,其形式为:
#undef 标识符
Eg:

#define MAX 100

……

#undef MAX

在以上代码中,首先使用#define定义标识符MAX,经过一段程序代码后,又可以使用#undef取消已定义的标识符。使用#undef命令后,再使用#ifdef max,将不会编译后的源代码,因为此时标识符MAX已经被取消定义了。

3)预定义的宏名

       ANSI C标准预定义了五个宏名,每个宏名的前后均有两个下画线,避免与程序员定义相同的宏名(一般都不会定义前后有两个下划线的宏)。这5个宏名如下:
●  __DATE__:当前源程序的创建日期。
●  __FILE__:当前源程序的文件名称(包括盘符和路径)。
●  __LINE__:当前被编译代码的行号。
●  __STDC__:返回编译器是否位标准C,若其值为1表示符合标准C,否则不是标准C.

● __TIME__:当前源程序的创建时间。
Eg:

#include<stdio.h>

int main()

{

   int j;

   printf("日期:%s\n",__DATE__);

   printf("时间:%s\n",__TIME__};

   printf("文件名:%s\n",__FILE__);

   printf("这是第%d行代码\n",__LINE__);

   printf("本编译器%s标准C\n",(__STD__)?"符合":"不符合");
   return 0;

}

4)重置行号和文件名命令------------#line

使用__LINE__预定义宏名赈灾编译的程序行号。使用#line命令可改变预定义宏__LINE__与__FILE__的内容,该命令的基本形如下:
 #line number[“filename”]

其中的数字为一个正整数,可选的文件名为有效文件标识符。行号为源代码中当前行号,文件名为源文件的名字。命令为#line主要用于调试以及其他特殊应用。
Eg:

1:#include<stdio.h>

2:#include<stdlib.h>

4:#line 1000

 

6:int main()

7:{

8:    printf("当前行号:%d\n",__LINE__);

9:    return 0;

10:}

在以上程序中,在第4行中使用#line定义的行号为从1000开始(不包括#line这行)。所以第5行的编号将为1000,第6行为1001,第7行为1002,第8行为1003.

5)修改编译器设置命令 ------------#pragma

#pragma命令的作用是设定编译器的状态,或者指示编译器完全一些特定的动作。#pragma命令对每个编译器给出了一个方法,在保持与C语言完全兼容的情况下,给出主机或者操作系统专有的特征。其格式一般为:
#pragma Para

其中,Para为参数,可使用的参数很多,下面列出常用的参数:
Message参数,该参数能够在编译信息输出窗口中输出对应的信息,这对于源代码信息的控制是非常重要的,其使用方法是:
#pragma message(消息文本)

当编译器遇到这条指令时,就在编译输出窗口中将消息文本显示出来。
另外一个使用比较多得pragma参数是code_seg.格式如:
#pragma code_seg([“section_name”[,section_class]])

它能够设置程序中函数代码存放的代码段,在开发驱动程序的时候就会使用到它。
参数once,可保证头文件被编译一次,其格式为:
#pragma once

只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。

6)产生错误信息命令 ------------#error

#error命令强制编译器停止编译,并输出一个错误信息,主要用于程序调试。其使用如下:
#error 信息错误
注意,错误信息不用双括号括起来。当遇到#error命令时,错误信息将显示出来。
例如,以下编译预处理器命令判断预定义宏__STDC__,如果其值不为1,则显示一个错误信息,提示程序员该编译器不支持ANSI C标准。
#if __STDC__!=1

   #error NOT ANSI C

    #endif

关于宏定义的知识,此处参考了http://blog.csdn.net/dlutbrucezhang/article/details/8753765

 

2.7 小结

在本章中主要系统地介绍了C语言编程的一些基础语法知识,从C语言的概述到数据类型,再到程序语句与预处理命令,以这样一个有序的思路线条帮读者回顾C语言的知识体系,使读者在新的系统下学习C语言编程时不至于太吃力,并且能够是读者在已经了解了C语言编程的基础上更轻松地学习Linux系统下的编程,可以为读者在后续章节中的学习打好基础。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值