码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-02 10:17:22      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:c语言深度解剖   c语言   符号   读书笔记   嵌入式   

第二章    符号
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 运算符的优先级


技术分享




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

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

标签:c语言深度解剖   c语言   符号   读书笔记   嵌入式   

原文地址:http://blog.csdn.net/cowena/article/details/47204383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!