C语言深度解剖——读书笔记-4、符号

第二章    符号

2.1
注释符号

知识点一:几个似是而非的注释问题

C语言的注释可以出现在C语言代码的任何地方,这句话对不?好,我们来从下面的例子分析中找出答案:

例: (a) int /*....*/i;                 (b)char  *s="abcdefg     //hijklmn";

(c) //Is it  a \

valid  comment?

下面我们来分析一下:(a)编译器会剔除注释,但是不是简单的剔除,而是用空格代替原来的注释;   所以(a)经过编译器后是: int  i    而不是:inti

(b)用引号引起来都是字符串常量,那双斜杠也不例外;

(c)因为“\”是一个连续符。

知识点二:出色注释的基本要求

1、对于全局数据(全局变量、常量定义等)必须要加注释;

2、.注释采用英文,尽量避免在注释中使用缩写,特别是不常用的缩写;(因为不一定所有的编译器都能显示中文,所以别人打开你的代码,你的注释也许是一团乱码。还有,你的代码不一定时懂中文的人阅读);

3、注释的代码段时应注重"为何做
why" ,而不是"怎么做 how";

4、.数值的单位一定要注释。

2.2
续行符和转义符

知识点一:反斜杠(\)的两种用途:

1. 
“接续符"   ----编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行;(注意:反斜杠之后不能有空格,反斜杠的下一行之前不能有空格);

2.用作转义字符的开始标识。 
例如:\n   \t  \b。

2.3
单引号、双引号 

【注意】表示方式不一样,所占的内存大小也不一样。

1,‘1‘,"1"

第一个是整型常数,32位系统下占4字节。

第二个是字符常量,占1个字节。

第三个是字符串常量,占2二个字节(包括字符串结束符(‘/0‘))。

【注意】字符在内存里是以ASCAII码存储的,所以字符常量可以与整型常量或变量进行运算。如:‘A‘+1。

2.4
逻辑运算符

" || " 两边只要有一个为真,其结果就为真;

"&&"  两边要同时为真,其结果才为真

【注意】||和&&是逻辑运算符,|和&是按位运算符。

【注意】小心“短路规则”。

最容易忘记规则的两个运算符:

三目运算符:(a?b:c)   当a的值为真的时候   返回b的值,否则返回c的值

逗号表达式:a,b    表达式的值为b的值

2.5
位运算符

C语言中位运算包括下面六种:

&    按位于 |    按位或

^    按位异或(p^q=~p*q+p*~q)
~    取反

<<    左移 >>    右移

【注意】用异或^运算符可以实现对两个数的交换。(想想,交换两个整数有几种方法?异或,中间变量,先加后减,……)

【问题1】左移和右移

[1] 左移运算符"<<"是双目运算符。其功能是把"<<"左边的运算数的各二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

[2] 右移运算符">>"是双目运算符。其功能是把">>"左边的运算数的各二进制位全部右移若干位,由">>"右边的数指定移动的位数。

但注意:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0还是1取决于编译系统的规定。Turbo C和很多系统规定为补1。

【问题2】0x01<<2+3的值为多少?结果为7吗?

// warning C4554: “<<”: 检查运算符优先级可能存在的错误;使用圆括号阐明优先级 (VS2008提示)

int ival=0x01<<2+3;// 32

因为"+"号的优先级比移位运算的优先级高。

【注意】左移和右移的位数不能大于数据的长度,而且不能小于0,否者其行为未定义。

2.6
花括号

【问题】花括号的作用是什么?

char a[10]="abcd";

char b[10]={"abcd"};

//char c[10] { ="abcd" };// error

简单地说,花括号的作用就是:打包,使其中的语句成为一个整体,并与外界绝缘。

2.7
++、-- 操作符

【问题】下面的结果是什么?

int i=3, j;

j=(++i)+(++i)+(++i);// j==18 (VS2008)

int i=3, j;

j=(++i)+(++i)+(++i);// j==18 (VC6.0)

j的值是多少呢?15、16、18吗?

其实对于这种情况,C语言标准并没有作出规定。

VS2008的计算过程是:i先经过3次自加后变为6,然后3个6相加得18。

VC6.0的计算过程是:先计算前两个i的和,这个时候i自加2次,2个i的和为10,然后再加上第三次自加的i得16。

贪心法:

每一个符号应该尽可能多的包含字符。

2.8 表达式2/(-2)的值是多少?

  1. #include <cstdio>
  2. int main()
  3. {
  4. int ival0=(-2)/2;   // -1
  5. int ival1=2/(-2);   // -1
  6. int ival2=2%(-2);   // 0        equals to 4%2
  7. int ival3=(-2)%2;   // 0        equals to -(2%2)
  8. int ival4=3%(-3);   // 0        equals to 6%3
  9. int ival5=(-3)%3;   // 0        equals to -(3%3)
  10. int ival6=2%(-3);   // 2        equals to 5%3
  11. int ival7=(-3)%2;   // -1       equals to -(3%2)
  12. int ival8=5%(-2);   // 1        equals to 7%2
  13. int ival9=(-2)%5;   // -2       equals to -(2%5)
  14. return 0;
  15. }

大多数编译器要求:余数与被除数的正负号相同。

2.9 运算符的优先级

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:05:40

C语言深度解剖——读书笔记-4、符号的相关文章

C语言深度剖析——读书笔记

1. 什么是定义,什么是声明? 定义:编译器创建一个对象,并为这个对象分配一块内存,给它取上一个名字. 声明:1>告诉编译器这个名字已经已经分配到一块内存上了 2>告诉编译器这个名字已经被预定了,别的地方不能再用它来作为变量名或对象名. 2. auto: 在缺省的情况下,编译器默认所有的变量都是auto的, 3. register: register变量必须是单个的值,并且其长度应该小于或等于整形的长度,而且register变量可能不存放在内存中,所以不能用&--取地址符来获取regi

《数据结构与算法分析:C语言描述》读书笔记

我们数据结构的课用了这本英文教材,作者是Mark Allen Weiss.总体来说比<算法导论>简单很多,但内容上交集非常大.其实是因为去掉了大多数证明和数学,对于没有耐心看符号和公式的人,显得更友好,更通俗.其中的代码实现很靠谱,照着敲出来基本正确可运行,这点尤其适合入门者. 不过现在读<算法导论>以后,感到还是应该沉下心来和公式.定理神马的打打交道.Mark Allen Weiss这本书确实适合大一和大二的同学看,大三就不适合了. 深深地明白了为什么大神说“算法导论其实很浅显”

《javascript语言精粹》读书笔记四

第七章 正则表达式 正则表达式是处理字符串的最强道具,没有之一. 通过正则表达式,我们可以非常简便的对字符串进行各种操作,这里就对此就不对这章进行总结,之后对正则表达式进行一次专门的总结. 第八章 方法 '+'运算符在较新的浏览器中,进行过较多的优化,会对该运算符进行优化,比array.join函数运行速度要快的多. array Array.concat和Array.slice函数可以生成新的数组. Array.shift函数通常比pop速度要快. 在使用Array.sort回调函数中,默认会将

《R语言实战》读书笔记--为什么要学

本人最近在某咨询公司实习,涉及到了一些数据分析的工作,用的是R语言来处理数据.但是在应用的过程中,发现用R很不熟练,所以再打算学一遍R.曾经花一个月的时间看过一遍<R语言编程艺术>,还用R做过阿里的推荐算法比赛,对R语言有一些最初级.基本的了解.不过 ,上面那本书虽然挺好,但是不适合速成,是从程序员的角度写的,对常用函数和统计知识涉及的不多.在实际工作中,发现适时应用R的包和函数是十分重要的,所以打算另找一本书来看.在学校放着一本<R语言实战>,无奈没拿过来,就用电子版的学一遍吧.

《R语言实战》读书笔记--第二章 创建数据集

2.1数据集的概念 变量的类型是不同的,比如标示符.日期变量.连续变量.名义变量.有序型变量等,记得数据挖掘导论中有专门的描述. R可以处理的数据类型包括了数值型.字符型.逻辑型.复数型(虚数).原生型(字节). 2.2数据结构 R拥有很多存储数据的对象类型,包括 标量.向量.矩阵.数组.数据框.列表.它们可以用下图表示: 因子是R中的名义型或者有序型变量,比较特殊. 2.2.1向量 标量是只有一个元素的向量,一般用来保存常量.其他没什么说的. 2.2.2矩阵 矩阵创建函数: matrix(da

《C语言深度剖析》笔记

关键字: C语言关键字32个: 关键字                                         意 义 auto                           声明自动变量,缺省时编译器一般默认为 auto int                               声明整型变量 double                       声明双精度变量 long                            声明长整型变量 char         

《javascript语言精粹》读书笔记二

本节是对语言精粹第四章的一些总结和精华梳理,因为这一章主要是说明函数这个js中的一等公民的,所以专门抽出一节来希望把这个部分说透. 第四章 函数对象,函数对象也是一个对象之中,函数对象在创建中会产生一个prototype属性. 函数字面量,通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包.这是js强大表现力的来源. 函数调用方式,函数一共有四种调用方式,这四种调用方式在初始化this这个关键参数上存在差异: 1. 方法调用模式 2. 函数调用模式 3. 构造器调用模式 4.

《javascript语言精粹》读书笔记一

前言 这是一本老道(douglas crockford)写的关于js的经典书籍,这本书的英文名称叫做<javascript:the good parts>,它诠释的是js这门语言的精彩部分,可以说他将js这门语言中最精华和有趣的部分都展现在大家面前了. 由于最近比较忙碌,在抽空搭建起blog了以后,直到现在才真正的提起劲头来准备真真的写点什么,其实也是为了给自己一个督促和鞭策,同时把在书中看到的觉得很棒的部分记录下来. 第二章 语法 本章介绍js的语法,这里没有什么特别的地方,语法是一门语言的

Android深度探索读书笔记 第八章

代码的重用分为静态重用跟动态重用.静态重用:采用标准的c程序的方式,将要重用的代码放在其他的文件中,如果要使用相应的某些功能,include相应头文件即可.动态重用:也就是一个linux驱动可以使用另外一个linux驱动中的资源.还有另外一种代码共享的方式:,模块依赖,也称为导出符号.在一个驱动模块里使用另外一个驱动模块里的被导出的符号(常量.变量.函数等).编译是由多个文件组成的linux驱动,如果linux驱动代码不多,可以将所有的代码放在一个文件中,如果linux驱动代码比较复杂,就需要使