第一章:C语言关键字(3)

2019-04-14 23:24

函数含义标识符构成:动词(一般现时)+目标词+[状语]+[目的地];

10、程序中不得出现仅靠大小写区分的相似的标识符。例如: int x, X; 变量x 与X 容易混淆

void foo(int x); 函数foo 与FOO 容易混淆 void FOO(float x);

这里还有一个要特别注意的就是1(数字1)和l(小写字母l)之间,0(数字0)和o(小写字母o)之间的区别。这两对真是很难区分的,我曾经的一个同事就被这个问题折腾了一次。

11、一个函数名禁止被用于其它之处。例如: #include \void foo(int p_1) {

int x = p_1; }

void static_p(void) {

int foo = 1u; }

12、所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。例如: const int MAX_LENGTH = 100; //这不是常量,而是一个只读变量,具体请往后看 #define FILE_PATH “/usr/tmp”

13、考虑到习惯性问题,局部变量中可采用通用的命名方式,仅限于n、i、j 等作为循环变量使用。

一定不要写出如下这样的代码: int p; char i; int c; char * a;

一般来说习惯上用n,m,i,j,k 等表示int 类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p 等表示指针。当然这仅仅是一般习惯,除了i,j,k 等可以用来表示循环变量外,别的字符变量名尽量不要使用。

14、定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据。这个问题在内存管理那章有非常详细的讨论,请参看。

15、不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度数据扩展。

6. C语言sizeof关键字—被冤枉的关键字

一、常年被人误认为函数。

sizeof 是关键字不是函数,其实就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份。看下面的例子: int i=0;

A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;

毫无疑问,32 位系统下A),B)的值为4。那C)的呢?D)的呢?在32 位系统下,通过Visual C++6.0 或任意一编译器调试,我们发现D)的结果也为4。

咦?sizeof 后面的括号呢?没有括号居然也行,那想想,函数名后面没有括号行吗?由此轻易得出sizeof 绝非函数。

好,再看C)。编译器怎么怎么提示出错呢?不是说sizeof 是个关键字,其后面的括号可以没有么?那你想想sizeof int 表示什么啊?int 前面加一个关键字?类型扩展?明显不正确,我们可以在int 前加unsigned,const 等关键字但不能加sizeof。好,记住:sizeof 在

计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。一般情况下,咱也别偷这个懒,乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。

做我的关键字,让人家认为是函数去吧。

二、sizeof(int)*p 表示什么意思?

留几个问题(讲解指针与数组时会详细讲解),32 位系统下: int *p = NULL; sizeof(p)的值是多少? sizeof(*p)呢?

int a[100];

sizeof (a) 的值是多少?

sizeof(a[100])呢?//请尤其注意本例。 sizeof(&a)呢? sizeof(&a[0])呢?

int b[100]; void fun(int b[100]) {

sizeof(b);// sizeof (b) 的值是多少?

7. C语言ned、unsigned关键字

我们知道计算机底层只认识0、1.任何数据到了底层都会变计算转换成0、1.那负数怎么存储呢?

肯定这个“-”号是无法存入内存的,怎么办?很好办,做个标记。把基本数据类型的最高位腾出来,用来存符号,同时约定如下:最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;如果最高位是0,表明这个数是正数,其值为除最高位以外的剩余位的值。

这样的话,一个32位的signed int类型整数其值表示法范围为:- 231~231 -1;8 位的char类型数其值表示的范围为- 27~27 -1。一个32位的unsigned int类型整数其值表示法范围为:0~ 232 -1;8位的char类型数其值表示的范围为0~28 -1。同样我们的signed 关键字也很宽恒大量,你也可以完全当它不存在,编译器缺省默认情况下数据为signed 类型的。

上面的解释很容易理解,下面就考虑一下这个问题: int main() {

char a[1000]; int i;

for(i=0; i<1000; i++) {

a[i] = -1-i; }

printf(\ return 0; }

此题看上去真的很简单,但是却鲜有人答对。答案是255。别惊讶,我们先分析分析。

for 循环内,当i 的值为0 时,a[0]的值为-1。关键就是-1 在内存里面如何存储。

我们知道在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。

按照负数补码的规则,可以知道-1 的补码为0xff,-2 的补码为0xfe……当i 的值为127时,a[127]的值为-128,而-128 是char 类型数据能表示的最小的负数。当i 继续增加,a[128]的值肯定不能是-129。因为这时候发生了溢出,-129 需要9 位才能存储下来,而char 类型数据只有8 位,所以最高位被丢弃。剩下的8 位是原来9 位补码的低8 位的值,即0x7f。

当i 继续增加到255 的时候,-256 的补码的低8 位为0。然后当i 增加到256 时,-257 的补码的低8 位全为1,即低八位的补码为0xff,如此又开始一轮新的循环……

按照上面的分析,a[0]到a[254]里面的值都不为0,而a[255]的值为0。strlen 函数是计算字符串长度的,并不包含字符串最后的?\\0?。而判断一个字符串是否结束的标志就是看是否遇到?\\0?。如果遇到?\\0?,则认为本字符串结束。

分析到这里,strlen(a)的值为255 应该完全能理解了。这个问题的关键就是要明白char类型默认情况下是有符号的,其表示的值的范围为[-128,127],超出这个范围的值会产生溢出。另外还要清楚的就是负数的补码怎么表示。弄明白了这两点,这个问题其实就很简单了。

留三个问题:

1)按照我们上面的解释,那-0 和+0 在内存里面分别怎么存储? 2)

int i = -20;

unsigned j = 10; i+j

的值为多少?为什么? 3)

下面的代码有什么问题? unsigned i ; for (i=9;i>=0;i--) {

printf(\

8. C语言if、else超级组合

if 语句很简单吧。嗯,的确很简单。那我们就简单的看下面几个简单的问题:

一、bool 变量与“零值”进行比较

bool 变量与“零值”进行比较的if 语句怎么写?bool bTestFlag = FALSE;//想想为什么一般初始化为FALSE 比较好?

A), if(bTestFlag == 0); if(bTestFlag == 1);

B), if(bTestFlag == TRUE); if(bTestFlag == FLASE); C), if(bTestFlag); if(!bTestFlag);

哪一组或是那些组正确呢?我们来分析分析:

A)写法:bTestFlag 是什么?整型变量?如果要不是这个名字遵照了前面的命名规范,肯怕很容易让人误会成整型变量。所以这种写法不好。

B)写法:FLASE 的值大家都知道,在编译器里被定义为0;但TRUE 的值呢?都是1吗?很不幸,不都是1。Visual C++定义为1,而它的同胞兄弟Visual Basic 就把TRUE 定义为-1.那很显然,这种写法也不好。

大家都知道if 语句是靠其后面的括号里的表达式的值来进行分支跳转的。表达式如果为真,则执行if 语句后面紧跟的代码;否则不执行。那显然,本组的写法很好,既不会引起误会,也不会由于TRUE 或FLASE 的不同定义值而出错。记住:以后写代码就得这样写。

二、float 变量与“零值”进行比较

float 变量与“零值”进行比较的if 语句怎么写? float fTestVal = 0.0;

A), if(fTestVal == 0.0); if(fTestVal != 0.0);


第一章:C语言关键字(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:四年级下册品社教学计划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: