那年曾让我哭笑不得抓狂的C语言

1.关于+=以及-=

这是两个运算符,但你否有过这种经历:

int temp;char ifor(i=0;i<MAX;i++){…temp=+2;//这里本意是每次循环,temp都自增2,但是却将’+=’写成了’=+’,按照这种写法,每次循环都为temp赋值正数2,与本意相差甚远}

2. 关于意想不到的死循环

unsigned char i; for(i=0;i<256;i++) {//something }

与之相类似的代码是:

unsigned char i; for(i=10;i>=0;i–) {//something }

这就告诉我们对于每个变量类型的取值范围要由清醒的认识。值得注意的是相同的变量类型对于不同的CPU

3. 关于’=’和’==’

if(Value=0x01){//something}

避免这个问题的一个很好的办法是使用良好编程习惯,比如上面的代码可写为:

if(0x01==Value){//something}

将常量值放到变量的前面,即使将等于运算符写成赋值运算符,编译器也能产生一个语法错误,因为将一个变量赋值给一个常量是非法的。

4.error:#7:unrecognizedtoken

我在刚使用

真是让人感慨万分的错误!我们这些与硬件打交道的程序员,,为模数电生,为

5.关于字母

6.sizeof()

不知道有多少人和我曾经一样,将这个关键字认为是一个库函数。

int i,j;j=sizeof(i); //对于这一句,当初压根没把它往关键字上想,这家伙伪装的实在够好。

总体来说,关键字sizeof的具有一定的变态基础的,在我还是小白的时候,曾经为下面的一道题伤过脑袋:

int*p=NULL;

sizeof(p)的值是:

sizeof(*p)的值是:

inta[100]

sizeof(a)的值是:

sizeof(a[100])的值是:

sizeof(&a)的值是:

sizeof(&a[0])的值是:

intb[100];

voidfun(intb[100])

{

sizeof(b);

}

sizeof(b)的值为:

7 关于数组越界

int a[30];for(i=30;i>0;i–){a[i]=something;}

8. 关于宏

#define MAX_TAST 4;

这个错误编译器会指出的,即便这样,相信很多同学在最初的时候也不会在第一时间发现这句代码的最后多了一个分号。这个分号会导致一些编译器报错,因为宏定义的结尾并不需要分号。

既然提到#define,还是说说它需要注意的几个点,也是经常在资料上被提及的。

#define SQR(x) x*x ………….. 1

或者这样写:

#define SQR(x) (x)*(x) …………… 2

#define SQR(x) ((x)*(x))

#define SQR (x) ((x)*(x))

这已经不是

#define SQR(x) printf("The square of x is %d.\n",((x)*(x))") 如果这样使用宏: SQR(8)

则输出为:

Thesquareofxis64.

#define SQR(x) printf("The square of "#x" is %d.\n",((x)*(x))")

这样得到的结果为:

Thesquareof8is64.

上面的这些例子,恐怕是网上随处可见的,但真的会这么用却有待考证。下面给出一个我自己遇到的不加括号产生错误的例子。在嵌入式编程中,遇到读取IO端口某一位的电平状态的场合是在平常不过的了,比如在NXP的ARM7中,读取端口P0.11的电平状态并判断是否为高电平,代码如下:

#define READSDAIO0PIN&(1<<11)//定义宏,读IO口p0.11的端口状态,但并未使用足够多的括号//判断p0.11端口是否为高电平,使用下述语句就是错误的:if(READSDA==(1<<11)){//是高电平,处理高电平的问题}编译器在编译后将宏带入,原if语句变为:if(IO0PIN&(1<<11) ==(1<<11)){//是高电平,处理高电平的问题}这样的话,运算符’==’的优先级是大于’&’的,从而IO0PIN&(1<<11)==(1<<11))语句等效为IO0PIN&0x00000001,相当于判断P0.1是否为高电平,与原意相差甚远.

9.数组和指针

定义一个数组:

int a[10]={1,2,3,4,5,6,7,8,9,0};

定义一个指针:

int *p;

如果,对指针p赋值:

p=a;

那么,a+1=?

&a+1=?

p+1=?

p[2]=?

*(p+2)=?

*(a+2)=?

再如果

int *ptr=(int *)(&a+1);

那,*(ptr-1)=?

明白了上面那些,关于sizeof的计算也就不会困难了:

对于最后一个问题,涉及到指针的加减。

&a

10.3/(-3)=?

3%(-2)=?

(-3)%2=?

抛开它是否有实际的意义,这个看似简单的语句,不知道有多少同学不确定结果到底是什么。

11.指针数组与数组指针

有一段时间,我怎么都不能区分指针数组和数组指针,就像下面的声明:

int * p1[10];int (*p2)[10];希望你灰暗的心情在此刻明亮起来,去迎接美好的明天!

那年曾让我哭笑不得抓狂的C语言

相关文章:

你感兴趣的文章:

标签云: