Linux C编程学习1---C语言基础(简介、预处理……)

C的简介

  C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的

  C语言的表达能力十分强大。C语言兼顾了高级语言和汇编语言的一些特点,既可以像汇编语言那样直接访问硬件的功能,也具有高级语言那样面向用户容易记忆、便于阅读和书写的优点

  C语言的可移植性很好,C语言中没有依赖于硬件的输入输出语句,输入输出功能都是通过调用库函数来实现的,所以在一种计算机平台上开发的程序不需要进行修改或者只需要进行简单的修改就可以移植到另外的一个计算机平台

  C语言中具有预处理功能,所以C语言就可以利用宏指令来提高程序的可读性和可移植性

C的开发流程

  C是一种编译型语言,所谓编译型语言是指在程序运行之前,需要先经过编译和链接过程:

1) 编辑源文件(获得源文件)

2) 编译源文件(获得目标文件)

3) 链接目标文件及库文件(获得可执行文件)

4) 运行程序(获得运行结果)

  

对变量定义的理解

  比如: int i;

  定义一个变量的过程实际上是向内存申请一个符合这个变量的数据类型的存储单元的过程,因此可以认为变量的实质就是内存中某一个单元的格式符,对这个格式符的引用就相当于对相应的内存单元的读取操作

字符数组和字符串

  用来存放字符型数据的数组称为字符数组。字符数组的每个数组元素存放一个字符。作为数组的其中一个类型,字符数组的定义、初始化和易用等规则和一般的数组一样

  字符串在C 语言中被当做字符数组来处理(其他比如java就是有单独一个String 类型)

  需要注意的是:C 语言中字符串的末尾都隐含一个‘\0‘ 字符,因此长度为 n 的字符串在内存中占用 n+1个字节

预处理

  预处理是C 语言的一个重要的功能,它是由预处理程序负责完成的。当对一个源文件进行编译时,系统将自动调用于处理程序对文件中的预处理部分进行处理,完成之后才进入对源文件的编译。C语言中提供的预处理功能包括宏定义文件包含以及条件编译

  设计和编写源程序的时候有效的使用预处理可以提高项目的可移植性……

宏定义

  C语言源程序中,使用一个标识符来表示一个字符串,称为宏。程序编译之前,预处理程序会将源程序中的标识符替换为字符串,这个过程称为宏展开

  1) 不带参数的宏定义,比如

//#define 宏名 字符串
#define PI 3.1415926

....
//就可以使用这个宏
c=2*PI*r;
...

  2) 带参数的宏定义

//#define 宏名(形式参数) 字符串
#define MAX(a,b) (a>b)?a:b

  注意带参数的宏定义,宏名 和 (形式参数)之间是不能有空格的,否则会在展开时出错,假如有空格,就会在调用MAX(a,b) 的时候被替换(a,b) (a>b)?a:b (a,b),所以完全不是我预想的效果。

  宏调用对的过程,其实只是一个符号的替换(在编译之前),和函数是完全不同的

文件包含

  文件包含是将指定文件的内容插入到当前文件之中。使用文件包含,可以减少程序设计人员的重复劳动,提高程序的开发效率

  1) #include<文件名>

  在系统设定的目录中进行查找,一般是通过环境变量来进行设定,一般用这种形式包含系统的头文件

  2) #include"文件名"

  在当前的路径下进行查找,如果没有找到再去系统指定的目录下进行查找,一般用这种形式包含用户自定义的头文件

条件编译

  C语言中引入条件编译主要是为了在不同的情况下控制不同的代码段被编译,这样可以将针对不同情况的代码编写在同一个程序文件中,从而方便程序的维护和移植。同时,使用条件编译可以使目标程序变小,运行速度变快

  1) #if、#else、#elif、#endif命令

#if 常量表达式
    代码段1
#else
    代码段2
#endif

  如果常量表达式的值为真(非0),编译代码段1,否则编译代码段2

  2) #ifdef、#else、#ifndef、#endif命令

#ifdef 宏名
    代码段1
#else
    代码段2
#endif

  如果宏名在前面已经定义过,编译代码段1,否则编译代码段2

时间: 2024-08-01 07:04:44

Linux C编程学习1---C语言基础(简介、预处理……)的相关文章

Linux Shell编程学习笔记一:shell简介

Q:什么是Shell,什么是shell脚本? A:Shell是一种用C语言编写的程序,它是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.它是命令语言.命令解释程序及程序设计语言的统称.它的作用就是遵循一定的语法将输入的命令加以解释并传给系统. 命令解释程序:shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用.用户在提示符下输入的命令都由shell先解释然后传给Linux核心.

Linux C编程学习2---GCC编译器

GCC简介 GCC(GNU Compiler Collection)是一套功能强大.性能优越的编程语言编译器,它是GNU计划的代表作品之一.GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操作系统的标准编译器 除了支持C,还支持C++.Java GCC常用选项 1. 基本选项 类型 说明 -E 预处理后即停止,不进行编译.汇编及连接 -S 编译后即停止,不进行汇编及连接 -c 编译或汇编源文件,但是不进行连接 -o file 指定输出文件为 file 例子: gcc

编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

你背或者不背,干货就在那里,不悲不喜 你学或者不学,编程就在那里,不来不去 听到这话的你是否略感扎心? 编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)01基础知识 计算机系统的主要技术指标与系统配置. 计算机系统.硬件.软件及其相互关系. 微机硬件系统的基本组成. 包括:中央处理器(运算器与控制器),内存储器(RAM与ROM),外存储器(硬盘.软盘与光盘),输入设备(键盘与鼠标)输出设备(显示器与打印机).如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

Linux C编程学习5---参考《那年,一步一步学linux c》全系列(目录索引)

漫无目的的搜索一些东西,发现的一个很好的资源,所以就一定要收藏下来,方便自己学习Linux C 的时候也能够去参考一下别人的学习之路,来更加促进我的学习和思考 说明 转载请注明出处:谢谢:http://blog.csdn.net/muge0913/article/details/7342977 博主的邮箱是:[email protected] 文章中若有不对或某些功能更好的实现方法,请指出或直接留言. 该系列文章中所用结构数据代码均来自linux2.6.39. 1.那年,一步一步学linux c

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,