C
文章平均质量分 58
taesimple
这个作者很懒,什么都没留下…
展开
-
预处理命令
1.对于由#define定义的类函数宏,应使用足够数量的圆括号,如 #define SQUARE(X) ((X)*(X)) 此举是为了避免替换时由于运算优先级而出现的不可预料的错误 另外,为了保证类函数宏正确运算,尽量不要使用自增(自减)运算进行宏替换2.宏与函数比较 1)宏产生内联代码,即在代码中出现宏的所有地方都进行替换。而整个程序中只有一份函数拷贝。因此从空间上讲函数优于宏。另一方面,函数的调用时间开销大于宏,因此在时间上宏优于函数。 2)在程序中只使用一次的宏对运行时间不会原创 2011-01-18 22:30:00 · 146 阅读 · 0 评论 -
结构,联合和枚举
结构结构的声明格式如下:struct id{ char first[10]; char last[10]; int age;}; //别忘了右花括号后面的分号1.和数组类似的是,结构变量可在定义时初始化,如:struct id tae = { "aaa", "bbb", 10 };同样的,这种初始化只能在定义时进行。若在定义之后的地方进行,编译器会报错;但可用匿原创 2012-05-02 10:06:15 · 432 阅读 · 0 评论 -
函数指针
什么是函数指针就像某一变量的地址可以存储在相应的指针变量中一样,指向函数的指针中保存着函数代码起始处的地址函数指针的声明当声明一个函数指针时,必须声明它指向的函数类型。要指定函数类型,就要指出函数的返回类型和参数列表,如:void (* pf)(int, int); //pf是一个函数指针,它指向的函数类型为:返回值为void,参数列表为(int, int)函原创 2012-05-02 16:16:39 · 117 阅读 · 0 评论 -
存储类
作用域 作用域可分为代码块作用域,函数原型作用域以及文件作用域代码块作用域:譬如函数的形参,函数体中定义的变量。作用范围从变量被定义的地方开始,到包含该定义的花括号结束,如:for(int i = 0; i < 10; i++){ //变量i的作用范围是for循环体内 ...}函数原型作用域:适用于函数原型中使用的变量名。作用范围从变量定义处原创 2011-01-19 10:14:00 · 181 阅读 · 0 评论 -
关于字符串
一些基本概念用字符数组保存这么一个字符串:char str[] = "hello world";然后我们应该知道,1.数组的大小是12(字符串字符个数+1),最后一个元素为'\0',用于标记字符串的结束。'\0'不是数字0,它是非打印字符,其ASCII码值为02.若使用如下定义:char str[100] = "hello world";则多余元素的值均默认为'\0'3.使原创 2012-05-02 21:23:20 · 129 阅读 · 0 评论 -
利用位异或(^)进行数值交换
首先,位异或具有如下性质:a^b^b == a;a^b^a == b;因此,我们可以利用位异或可以在不引入第三变量的情况下进行数值交换,代码如下:a = a^b;b = a^b;a = a^b;也可以写成a ^= b;b ^= a;a ^= b;但是应注意,当swap的两个参数是同一变量时,用位异或会出现错误,如:void swap(int原创 2012-05-07 21:00:34 · 233 阅读 · 0 评论 -
C中的断言(assert)
assert格式assert是C语言中的一个宏定义,基本格式为assert(bool expression);当bool expression的值为True,则assert不做任何动作;否则会在stderr中输出一条错误信息,其格式如下:Assertion failed: [expression], file [filename], line [nnn]assert的用法在原创 2012-05-08 21:45:31 · 216 阅读 · 0 评论 -
C中的断言(assert)
assert格式assert是C语言中的一个宏定义(需要包含assert.h),基本格式为assert(bool expression);当bool expression的值为True,则assert不做任何动作;否则会在stderr中输出一条错误信息,其格式如下:Assertion failed: [expression], file [filename], line [nnn]as原创 2012-05-08 22:09:22 · 596 阅读 · 0 评论 -
指针与数组的区别——From 《C专家编程》
区别之一在于定义与声明时如:extern int * a;extern int a[];下面讨论中的“对象”一词仅指变量、函数等,不包括OO中的对象首先应清楚区别定义与声明:声明所说明的并非自身,而是描述其他地方创建的对象,声明并未为对象分配内存;而定义为对象分配了内存。由于声明并未给对象分配内存,因此在声明数组时不需要提供数组长度的信息。这也解释了为什么C中数组定义时长度不能用原创 2011-04-14 00:24:00 · 295 阅读 · 0 评论 -
C中的类型转换
自动类型转换在表达式中使用混合类型时,C会使用一套规则来自动完成类型转换,其规则大致如下:1.当出现在表达式中时,有/无符号的char和short类型自动被转换为int2.在包含两种数据类型的任何运算中,两个值都被转换为级别较高的那一种(long double>double>float>unsigned long long>long long>unsigned long>long>un原创 2012-05-02 10:00:45 · 210 阅读 · 0 评论 -
C中的运算符优先级
1.自增++和自减--具有很高的优先级,只有圆括号( )比它们的优先级高,如x*y++; x*(y++); //二者等价我们应这样理解:自增减运算符只能影响“变量”,而x*y本身不是一个变量(而是一个计算结果),因此不可能是(x*y)++; //编译器会报错2.关于表达式中的自增减什么时候进行,以++为例n++; //先使用n,然后再将它增加++n; //先将n原创 2012-04-28 14:44:38 · 147 阅读 · 0 评论 -
转义符和占位符
<br />1.如何打印百分号%:连续两个%,即<br /> printf("%%"); //输出%<br /> NB:不能使用<br /> printf("/%");<br /> <br />2.原创 2011-01-23 20:57:00 · 157 阅读 · 0 评论 -
APUE学习笔记之文件I/O(二)
之前所介绍的I/O函数如open、read、write、lseek以及close,均是针对文件描述符的,即一个整数,而下面介绍的标准I/O函数,均是针对流进行操作的,即一个FILE类型指针(FILE对象是一个结构,包含对应文件若干信息)标准输入、标准输出以及标准错误输出的文件描述符和流对应关系为:标准输入:STDIN_FILENO/stdin标准输出:STDOUT_FILENO/stdout标准错原创 2011-06-28 15:00:00 · 224 阅读 · 0 评论 -
C语言的I/O函数
getchar():没有参数,它返回来自输入设备的下一个字符putchar():打印它的参数(不带回车换行)如char c = getchar();putchar(c);这两个函数仅处理字符(char),因此它们比通用的scanf()和printf()更快而且原创 2011-04-18 17:11:00 · 244 阅读 · 0 评论 -
APUE学习笔记之文件I/O
首先,这里讨论的函数均是不带缓存的I/O,即每个read和write都调用内核中的一个系统调用。这里讨论5个函数,分别是open、read、write、lseek以及close。使用以下函数及常数,需包含头文件fcntl.h 文件描述符(handle)是一个非负整数,有以下三个特殊文件描述符0 —— 标准输入(STDIN_FILENO) (需包含头文件unistd.h)1 —— 标准输出(S原创 2011-06-27 10:12:00 · 185 阅读 · 0 评论 -
浮点数陷阱
陷阱1double i;for(i = 0; i != 10; i += 0.1) printf("%.1lf\n", i);程序会打印至10.0时结束循环吗?不会。因为i永远也不可能等于10,这是个无限循环陷阱2if(0.1+0.1+0.1 ==原创 2011-08-25 20:33:19 · 1494 阅读 · 4 评论 -
关于const和参数传递的讨论
实际上,函数的形参和实参对于const的限制不需要保持一致,如:第一种情况void func1(const int n){ ... }int a;func1(a); //可以分析:形参被设为const,我们可以理解为函数宣布”在我的函数范围内这个参数的值不能被修改“,至于函数范围之外实参会不会被修改,函数不在乎,也管不着第二种情况void func原创 2012-04-25 11:07:37 · 288 阅读 · 0 评论 -
数组和指针
1.一种初始化数组的方法int array[] = {1, 3, 5, 7, 9}; //编译器根据花括号内元素的数目自动确定数组的大小需要注意的是:不允许在初始化之外的任何地方使用花括号对数组进行赋值,如int array[4];array[4] = {2, 4, 6, 8}; //错误2.快速获得数组长度的方法int a[5];int b[] =原创 2011-01-26 17:02:00 · 247 阅读 · 0 评论 -
指针常量与常量指针
指针常量指针常量:该指针只能在定义时初始化,之后其指针指向不能被改变,形如:int * const p;指针常量的指向不能被改变,但其所指向变量的值可以被改变,例子:int a = 2, b = 3, c = 5;int * const pa = &a, * const pb = &b, * const pc;*pa = *pa + 1; //正确pa = pb;原创 2012-04-26 09:50:22 · 134 阅读 · 0 评论 -
程序内存分布
1.栈:存放局部变量、函数参数及函数中间状态等,具有数据结构中的栈的“先进后出”特性。调用某个函数时,将该函数的上述数据入栈,结束调用时出栈销毁,因此可以理解为什么局部变量和形参的生存周期与函数调用相关。栈的优点是分配空间速度快,缺点是可分配空间有限2.堆:存放动态分配(malloc、new)的对象(与数据结构中的堆无任何关系)。根据C的特性,堆中存放的对象将一直存在直至人为释放(free)或原创 2012-05-28 22:41:46 · 272 阅读 · 0 评论