[已注销]对《C程序设计语言》的笔记(2)

C程序设计语言
  • 书名: C程序设计语言
  • 作者: (美)Brian W. Kernighan/(美)Dennis M. Ritchie
  • 副标题: 第 2 版·新版
  • 页数: 258
  • 出版社: 机械工业出版社
  • 出版年: 2004-1
  • 第120页
    c语言中,两个指针变量的“+”运算是非法的,因为两个地址的“差”表示一个地址到另一个地址间的增量(这个经常用到),但两个地址的“和”是没有意义的,为了避免误用,c语言干脆规定这是错误的。
    但是有例外,比如用到了指针数组的binarysearch,每次二分需要取两个指针当中的那个指针:
    middle = (low + high) / 2
    这样写编译器会报错:
    error: invalid operands to binary + (have ‘int *’ and ‘int *’)
    K&R告诉了我们一个技巧,写成:middle = low + (high -low) / 2就行了。
    (high -low)两个指针相减没问题,low加上一个offset也没问题,这样一来就能通过编译了。
    2011-07-05 16:16:49 回应
  • 第131页
    当flag(struct)超过一个机器字长怎么办?
    做个实验:
    #include<stdio.h>
    
    struct {
    	unsigned int is_0 	:	1;
    	unsigned int is_1	:	1;
    	unsigned int is_2 	:	1;
    	unsigned int is_3 	:	1;
    	unsigned int is_4 	:	1;
    	unsigned int is_5 	:	1;
    	unsigned int is_6 	:	1;
    	unsigned int is_7 	:	1;
    	unsigned int is_8 	:	1;
    	unsigned int is_9 	:	1;
    	unsigned int is_10 	:	1;
    	unsigned int is_11 	:	1;
    	unsigned int is_12 	:	1;
    	unsigned int is_13 	:	1;
    	unsigned int is_14 	:	1;
    	unsigned int is_15 	:	1;
    	unsigned int is_16 	:	1;
    	unsigned int is_17 	:	1;
    	unsigned int is_18 	:	1;
    	unsigned int is_19 	:	1;
    	unsigned int is_20 	:	1;
    	unsigned int is_21 	:	1;
    	unsigned int is_22 	:	1;
    	unsigned int is_23 	:	1;
    	unsigned int is_24 	:	1;
    	unsigned int is_25 	:	1;
    	unsigned int is_26 	:	1;
    	unsigned int is_27 	:	1;
    	unsigned int is_28 	:	1;
    	unsigned int is_29 	:	1;
    	unsigned int is_30 	:	1;
    	unsigned int is_31 	:	1;
    
            /* more than 32 bits */
    	unsigned int is_32	:	1;
    
    } flags;
    
    int main() 
    {
    	flags.is_10	=	1;
    	flags.is_32	=	1;
    	printf("%lld\n", flags);
    	printf("%d\n", sizeof(flags));
    	return 0;
    }
    
    当flag结构体内部定义“位”的数量小于等于32时,sizeof(flags)的结果都是4,正好是一个机器字长。
    当“位”的数量大于32时,sizeof(flags)的结果变成了8,说明编译器会自动扩充flags的长度。
    因为flags从32位变成了64位,因此在格式化输出时要用long long。
    2011-07-06 11:38:39 1人喜欢 回应

[已注销]的其他笔记  · · · · · ·  ( 全部295条 )

The Design of Everyday Things
1
About Face 3
6
Engineering a Compiler
1
人有人的用处
8
Understanding the Linux Kernel
4
计算机程序设计艺术
1
公正
1
The Art of Doing Science and Engineering: Learning to Learn
1
科学革命的结构
7
罗素论教育
3
三十六大
1
娱乐至死
3
Real World Haskell
2
Writing Analytically
1
Is Parallel Programming Hard, And, If So, What Can You Do About It?
1
计算机与人脑
1
组合数学
2
菊与刀
1
Rework
5
翻译新究
4
计算机程序的构造和解释(原书第2版)
5
The Laws of Simplicity
4
计算机组成与设计硬件/软件接口
6
写给无神论者
2
放任自流的时光
3
哥德尔、艾舍尔、巴赫
2
树上的男爵
2
C++语言的设计与演化
1
Land of LISP
7
C陷阱与缺陷
2
CUDA by Example
3
C++沉思录
1
世界尽头与冷酷仙境
4
Head First C
2
刀锋
1
并行编程模式
2
The Ph.D. Grind
2
计算机系统结构
2
禅与摩托车维修艺术
14
流浪的面包树
2
翻译研究
18
An Introduction to Programming in Emacs Lisp
1
GNU Emacs Lisp 编程入门
1
计算机系统概论
1
编码
3
拖延心理学
1
古今数学思想(一)
1
挪威的森林
9
奇特的一生
7
GPU高性能运算之CUDA
5
那些年,我们一起追的女孩
8
十八岁给我一个姑娘
2
C++编程思想(第1卷)
9
多核计算与程序设计
8
少有人走的路
5
忧伤的情欲
3
Hackers & Painters
7
哲学的慰藉
9
男人来自火星 女人来自金星
8
旅行的艺术
14
活着活着就老了
1
如何阅读一本书
7
Data-intensive Text Processing With Mapreduce
1
学习GNU Emacs
1
给研究生的学术建议
3
C专家编程
2
Spring揭秘
2
Head First Java(第二版·中文版)
1
自私的基因
1
计算机网络
3
自由在高处
2
大话设计模式
16
计算机网络
12