4Functions and Program Structure

scratch 刮擦 starting over from scratch从头开始 reside驻留 separately 分别的 facilities工具容易 macro arguments宏参数 pattern模式 irrelevant不相干的 sophisticated复杂的 optional sign 可选的标志 handles 处理 presence存在 invocation调用 scope rules 作用域规则

reorganizing 改组 mandatory强制的 受命令的 centralize使集中 peripherally外围的 recursion 递归 implementation贯彻 安装启用 macro宏 pitfalls陷阱 concatenation一系列相关

1UNIX cc main.c getline.c strindex.c把目标文件main.o getline.o strindex.o放到可执行文件a.out中  如果 main.c 错误 可以 cc main.c  getline.o strindex.o同样将main.c编译 和后两者一起载入 cc用.c和.o来区分源文件与目标文件

2return expression 要加括号 但是不是必须的

3dummy( ) { }   这个函数啥也不做啥也不返回 如果定义中缺省了返回类型 那么则为int

4返回非INT型变量可以先声明  如double atof( char s[ ]){  ****************}  可以在main中先声明  double sum, atof ( char [ ] );  声明了一个double 变量sum 和一个函数

5声明时 类型要相同 如果不同 函数和声明在同一个文件会被检测出error 而在多个文件(更常见)内则不会被检测到 比如函数返回double  主调声明int 那函数返回值将被转化为int 就没有意义了

6/* atoi:利用atof函数把字符串s转换成整数 */
int atoi( char s[ ] )
{
double atof(char s[ ]);
return (int) atof ( s );
}

其中如果用return atof ( s );atof也会被强制转换成int 但是编译器会出现警告信息(警告是什么 能吃么)

7逆波兰表示法 运算符号在运算量后面(1 - 2) * (4 + 5)一类的中辍可用逆波兰表示法表示成:1 2 - 4 5 + *  用栈计算就行 运算分量进栈 遇到运算符就pop两个分量出来(如果是二元运算符)运算后进栈 最后把栈顶的值拿出来输出

8+ * 满足交换律 顺序无所谓 可以push(pop()*pop())  而-和/要规定顺序 最好用临时变量调剂下 比如 op=pop(); push(pop()/op)

9c=getch()获取一个字符给c ungetch(c) 把c退回到缓冲区里(假装什么事都没有发生)

#define BUFSIZE 100
char buf[BUFSIZE]; /* 用于unget函数的缓冲区 */
int bufp = 0; /* buf中下一个自由位置 */
int getch(void) /* 取一个字符(可能是推回的字符) */
{
return ( bufp > 0 ) ? buf[--bufp] : getchar( );
}
void ungetch(int c) /* 把字符推回到输入中 */
{
if ( bufp >= BUFSIZE )
printf ( "ungetch: too many characters\n" );
else
buf[bufp++] = c;
}

标准函数里有ungetch

10外部变量的作用域从其声明处到函数的末尾

如main( ) { … }
int sp = 0;
double val[MAXVAL];
void push( double f ) { … }
double pop( void ) { … }

sp val 在push 和pop中无需声明就可以直接用 但是对main不可见

11如果一个外部变量在定义前就要用到 那就要强制用extern  声明就通报变量(主要声明一个类型) 定义是要有赋值(并不是赋值而是分配内存空间 解释错误)(存储分配)

如int sp;
double val[MAXVAL];
这两个说明定义了外部变量 s p与v a l,并为之分配存储单元,同时也用作供源文件其余部分
使用的说明。另一方面,如下两行:
extern int sp;
extern double val[MAXVAL];

为源文件剩余部分说明了 s p是一个 i n t类型的外部变量, v a l是一个 d o u b l e数组类型的外部变量

定义数组时要写上大小 extern声明时候就随意了.

12 static variables 静态变量 可以被当前所在源文件的函数调用 不能被其他函数访问 适用于说明外部变量和函数

static char buf[BUFSIZE]; /* 供ungetch函数使用的缓冲区 */
static int bufp = 0; /* 缓冲区buf的下一个自由位置 */
int getch( void ) { …}
void ungetch( int c) { … }

此处 buf和bufp只能被getch和ungetch用到

静态变量在作为内部变量时和自动变量相似  区别在于不管函数激活还是终止 静态变量的值都存在 自动变量随着函数的调用和结束 会消失

13 register variable 建议编译器 此变量为常用变量 建议放在寄存器内 当然编译器可以不鸟你 只能用在自动变量和实参上

register int x;

f(register unsignedm)

{

register int i;

}

想要在使用寄存器变量的地方加上 register没啥坏处 编译器可以将他们忽视掉 值得注意的是 加了这玩意不管是不是存在寄存器里 地址都不能访问了

14 外面的xy 和里面的xy 没有联系  但是最好也别这么编程 看得蛋疼

int x;

int y;
f ( double x )
{
double y;

}

15 外部变量和静态变量在初始化缺省下 为0  自动和寄存器变量为未定义(垃圾值)纯量变量会在定义时被初始化

如 int x = 1;  long day = 1000L*60L*60L*24L;

外部变量和静态变量 初始化必须是一个常量式子  初始化变量最好用显示的方式 比较直观

数组的初始化可以这样int days[ ] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };   数组大小缺省时 按元素个数计  这里数组大小为12

15 字符数组初始化可以用字符串

char pattern [] = "ould";

它是如下虽然长些但却与之等价的定义的缩写:
char pattern [] = { 'o', 'u', 'l', 'd' , '\0' }

数组个数为5

16#include "文件名"

#include <文件名>

前者从源程序找 后者从定义的规则找

17#define 名字 替换文本 如果较长 可以在后面加\可以延续多行

替换只对单词进行,对括在引号中的字符串不起作用。例如,如果Y E S是一个被定义的名字,那么在 printf ( "YES" ) 或Y E S M A N中不能进行替换。 

18#define max( A, B ) ( ( A ) > ( B ) ? ( A ) : ( B ) )

x = max( p+q, r+s );
将被替换成
x = ( ( p+q ) > ( r+s ) ? ( p+q ) : ( r+s ) );   形参将直接变替换

当然也有一定的缺陷

max( i++, j++ ) /* 错 */

又或者#define square( x ) x * x /* 错 */  在square(z+1)的情况下

#undef可以取消定义

#undef getchar

int getchar(void)

{·······}

可以用加#来替换字符串

#define dprint( expr ) printf( #expr " = %g\n", expr )
当用诸如
dprint( x/y );
调用该宏时,该宏就被扩展成
printf( "x/y" " = %g\n", x/y );  等价于printf(“x/y=%g\n”,x/y);

(***较复杂)  ##可以把形参就实参替换

#define paste( front, back ) front ## back
从而宏调用paste(name, 1)的结果是建立单词name1。

19条件包含 conditional inclusion #if

例一

#if !defined( HDR )    //如果没有定义HDR 则定义

#define HDR      /* hdr.h文件的内容*/

#endif   

例二

#if SYSTEM == SYSV   //根据不同的SYSTEM 选择不同的头文件
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"

#endif
# include HDR

例三 ifndef 如果没有

#ifndef HDR  //如果没有HDR (例一的变型)
#define HDR
/* hdr.h文件的内容*/
#endif

the c programing language 学习过程4的更多相关文章

  1. the c programing language 学习过程8

    glean 捡拾落穗; glean insight 深入了解 modeled模型化 peripheral外围的 himogeneous匀称的 intents 意图  excerpt摘录 intende ...

  2. the c programing language 学习过程7

    interact 互动 carriage运费运输 linefeed 换行 redirection改方向 interleaved交叉存取 adequate足够的 untouched原样的  specif ...

  3. the c programing language 学习过程6

    payroll工资名单 hierarchy分层层次 vexing 使人烦恼的 alignment结盟 semantics 语义 aethetic审美 parameterize 参数化 1结构标记 成员 ...

  4. the c programing language 学习过程5

    lumped 集成总结 mandating托管 consecutively连续地 contiguous临近的 mnemonic记忆力的 mimics 酷似 魔方 bind捆绑 synonym同义词 s ...

  5. the c programing language 学习过程3

    ControlFlow  控制流 specify 指定 compound statement 复合语句 cryptic有隐含意义的 ambiguity歧义 robust稳健 disintegratio ...

  6. the c programing language 学习过程2

    manipulated 操纵  notations符号 hexadecimal十六进制 precision精度 be concatenated at 把····联系起来 enumerations枚举  ...

  7. 使用一个数组存储一个英文句子"java is an object oriented programing language"

    class fun { public static void main(String[] args) { String str="java is an object oriented pro ...

  8. The python programing language

    Python is an example of high-level language. As you might infer from the name “high-level language”, ...

  9. Linux下C高手成长过程

    建议学习路径:  首先先学学编辑器,vim, emacs什么的都行. 然后学make file文件,只要知道一点就行,这样就可以准备编程序了.  然后看看<C程序设计语言>K&R, ...

随机推荐

  1. java连接mysql以及增删改查操作

    java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...

  2. linux ngix安装

    因为我完全按照第一篇参考文章从上到下一步步安装导致有些安装失败最后重装的,过程有点乱,就没自己总结please read the follow articles Linux 安装Nginx详细图解教程 ...

  3. 使用SoapUI调用Vsphere Web Service

    项目中经常需要调用Webservice进行验证测试,下面就介绍下如何使用测试工具SoapUI调用Vsphere vcenter的 Web Service VSphere的Webservice地址默认为 ...

  4. linkin大话数据结构--Collections类

    操作集合的工具类:Collections Collections 是一个操作 Set.List 和 Map 等集合的工具类.Collections 中提供了大量方法对集合元素进行排序.查询和修改等操作 ...

  5. linkin大话面向对象--包和导入

    我们现在的代码都扔在一个文件夹里面,比如以后我们做项目,是不是有可能有非常非常多的代码,那我就希望把不同功能和模块的类方便管理,放到不同的文件夹下,引出包概念. 什么是包,就一个文件目录,为了处理重名 ...

  6. MYSQL导入大量数据碰到的问题及解决方法

    在项目中,经常会碰到往数据库中导入大量数据,以便利用sql进行数据分析.在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面 ...

  7. MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  8. Jetson TX2上的demo(原创)

    Jetson TX2上的demo 一.快速傅里叶-海动图 sample The CUDA samples directory is copied to the home directory on th ...

  9. https原理及实践

    转载请注明出处 安全知识 网络安全问题 数据机密性 在网络传输数据信息时,对数据的加密是至关重要的,否则所有传输的数据都是可以随时被第三方看到,完全没有机密性可言. 数据机密性解决问题思路 利用算法 ...

  10. 所不为人知的Python装饰器

    装饰器可以说是Python中非常重要的特性之一.有些人要么从没使用过装饰器,要么就是对装饰器的使用一知半解.也有些人觉得装饰器很简单:"装饰器不就是那些把函数作为参数并输出一个函数的函数&q ...