教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 资格考试 >

C专家编程看书笔记

来源:网络收集 时间:2026-08-27
导读: C专家编程学习中的笔记 本文档基于《c专家编程.pdf》中文版问题结合《C语言程序设计》谭浩强(第三版),所进行实验的运行环境是Linux2.6内核和VC++6.0,原书作者代码均是以标准C来写的,结果只有Linux上相符合。 P43 apple = sizeof(int) *p; 1、 当其中的i

C专家编程学习中的笔记

本文档基于《c专家编程.pdf》中文版问题结合《C语言程序设计》<谭浩强>(第三版),所进行实验的运行环境是Linux2.6内核和VC++6.0,原书作者代码均是以标准C来写的,结果只有Linux上相符合。
P43
apple = sizeof(int) *p;
1、
当其中的int为类型名时,sizeof(int)为一个整体(43页有原话,当sizeof的操作数是个类型名时,两边必须加上括号,但操作数如果是变量则不必加括号)。
1.1、
当*为指针时,(《C语言程序设计》<谭浩强>)P365附录C, sizeof长度运算符和*指针运算符相同优先级,且自右向左结合。故原语句相当于,apple = 4 *(指针)p;所以错误。
1.2、
当*为乘号时,由于乘号优先级低于长度运算符,故原语句相当于,apple = 4 *(乘号)p;p为非负整数,没有错。
2、
当()为类型转换运算符时。
2 .1、
当*为指针时,sizeof 、()、* 三者优先级相同,且从右至左结合。*p 就为一指针,(int) *p 就是将指针类型强制转为int类型,此时原语句相当于,apple = sizeof int ;上面说过,当sizeof的操作数是个类型名时,两边必须加上括号,所以会报错。改为,apple = sizeof((int) *p) ;这时候正确。
2.2、
当*为乘号时,sizeof(int)优先级高于*(乘号),()不是类型转换运算符。故原语句相当于,apple = 4 *p ; p为非负整数,没有错。

P51
z = y+++++x;
先对++运算符做下总结:
(《C语言程序设计》<谭浩强>)P58
(1)、自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式,如(a+b)++不合法的;
(2)、++和--的结合方向是“自右向左”;
《c专家编程.pdf》P51:
z=y+++x;程序员的意图可能是 z = y + ++x; 但也可能是 z = y++ + x;
ANSIC规定了一种逐渐为人所熟知的“maximal munch stratety(最大一口策略)”。这种策略表示如果下一个标记有超过一种的解释方案,编译器将选取能组成最长字符序列的方案。以上面这个例子为例,它将被解析为 z = y++ + x;

按上面的策略 z = y+++++x; 将被解析为 z = y++ ++ + x;这将引起编译错误。这个在我的运行环境下也仍报错;
但是后面说编译器能够推断(从理论上说)惟一有效的编排方式是 z = y++ + ++x; 它还是出现编译错误。但是在本人运行环境下按 z = y++ + ++x; 输入语句,不出现错误,且能正确编译运行。
本人认为这是由于这本书在写的时候,与现在所用的编译器不同,现在的编译器具有更强
的自动识别能力,所以能够编译运行,但重要声明,输入格式必须从理论上是正确的,编译器才能正确识别。
这里写入几个相关++的表达式,叙述一下:
j = ++i++;(周立功公司内部C考试题) 这是 j = (++i)++; ?还是 j = ++(i++); ?
理论上:由最大一口策略,

C专家编程学习中的笔记

两个均是正确,仅一个字符序列。结合++的从右至左结合性,本人认为则j = ++(i++); 这个解释更合理。
现在人为加上括号,明确计算顺序,但是编译报错:invalid lvalue in increment;(在增量中无效的左值);反正只要后面表达式不正确,均会报此错(目前没能明白些错)。

int i = 3;
j = sizeof(i+++ ++i);正确
j = sizeof(i++ + ++i);正确
j = sizeof(i++ +++i);错误
j = sizeof(i+++++i);错误,因为最大一口策略,将会亦成((i++)++) + i;++++i,++(++i),i+++++,(i++)++均会报增量中无效的左值。
执行结果:j = 4; i = 3;因为sizeof()后面最终会是个int型的值,所以占四个字节;很值得注意的是,这不会改变i的值,这一点须牢记。

int i = 3;
q = ++i+ ++i;正确
q = ++i + ++i;正确
q = ++i +++i;错误
q = ++i+++i;错误,还是最大一口策略。
结果:q = 10,i = 5;又值得注意,我们可能会这样理解,第一个++i,用于计算q的结果会是4(先加再用),第二个i++,用于计算q的结果会是5,这样q = 9;但实际不是这样。
int i = 3,k = 3;
q = ++i + ++k;
结果是:q = 8;注意区分。

int i = 5;
m = i+++ ++i;正确
m = i++ + ++i;正确
m = i++ +++i;错误
m = i+++++i;错误
结果:m = 12,i = 7;这能不是很难理解。

int i = 0;
k = ++i+i++;
k = ++i + i++;
k = ++i+ i++;
k = ++i +i++;
以上格式均正确,最后结果 k = 2,i = 2。下面k = 4,而此处k = 2,有点难以理解。

int i = 2;
k = i+++i++;
k = i++ + i++;
k = i+++ i++;
k = i++ +i++;
以上格式均正确,最后结果 k = 4,i = 4。同时能够证明,比编译器是最大一口策略,+ 的优先级比 ++ 低。++是从右至左结合,如果这样理解的话,k = i + (++(i++)); 但实际不是这样,所以可以确定为最大一口策略。还值得注意的是 k = 4,从感觉上先计算i++,但这个表达式用于计算k的值是2(先用再加);这时i的值是3,再进行i++,用于计算k的值是3,此时i的值是4;如果这样k = 5。但实际不是这样,值得注意。

总结一下:
操作数如果都是先++,就先将两者++执行完再计算;如果是后++,就先将两者计算再执行++。其它情况正常进行。(这一点还是很难理解,只能做简单的总结,要深入思考为什么会这样,需要做更深的理解和深层次的程序运行实际情况的认识。)
最大一口策略,所以中间的‘+’只能接在前面操作数,或自行隔开,不能接在后面操作数前。

值得一提的是,由于经前的认识很多人会认为空格在c中多一个或者少一个,对程序无影响,此处我们可以看到,空格的力量(这也许是现在编译器更加智能化,能够自动识别一些程序员的思想)。所以,不要随意空格,要有良好的编程风格。

P66
这一页的结构体,让我做了一些测试,这过程中发现了一些

C专家编程学习中的笔记

有趣的事。
关于结构体struct有趣的情况,不知道是我才知道,还是原来可知道的时候我的思维跑飞了。
(我决定将下面的很多部分注释掉,最后发现这些只是我最终结论的过程,其中还有部分是错误的,但是很值得留下,这样能更深刻的记住和理解。)
***********************************************************************************************************************************************************************
当结构体成员中只有char类型时,指向该结构的指针也没有,这时用sizeof计算得出的结果是总char个数之和,即有多少个char类型就占多少字节。
只要结构体成员中有其它类型时,如int,double,指针等时,sizeof计算得出的结果一定是4的整数倍。
struct node_tag0{
char test;
struct nod_tag *next;
}a;
sizeof(a) = 8;

struct node_tag1{
char test0;
char test1;
char test2;
char test3;
char test4;
}b;
sizeof(b) = 5;

struct node_tag2{
char test0;
int test1;
struct nod_tag2 *next;
}c;
sizeof(c) = 12;

struct node_tag3{
char test[15];
char test0;
char test1;
struct nod_t …… 此处隐藏:3591字,全部文档内容请下载后查看。喜欢就下载吧 ……

C专家编程看书笔记.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/104901.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)