c语言语法容易忽视点

1、逻辑运算符 潜在的危险

void main()

{int x=3,y=4;

if(++x || ++y) printf("%d",y)

}

说明,本拟题中“||”判断符,只要前面是1,就不计算后面的,直接返回正确

同样可以想象“&&”判断的时候,只要前面是0,就直接返回了

 

2、关于++p和p++在程序中区别的问题

      大家都知道int p=2; int m; m=p++的结果是m=2,而m=++p的结果是3,这很容易理解,p++是先运算,后赋值的。

      那么在遇到问题的时候,就不妨将其用一个变量代替,下面附上例子:

(1)int i=3;

do{printf("%d",i-=2)}

        while(!(--i));//此时只打出3,我们可以换呈while(!m)这样就容易理解写

(2)int a[]={0,1,2,3,4,5,6};

int *p; p=a;

printf("%d %d %d %d",*p++,++*p,*(p++),*(++p));

       说明:指针的移位,就要括号括起来的那种,本题目打印的结果应该是2 2 1 1

printf从左往右运算,因为*的优先级低于++,所以等同于*(p++)。第二个相当于++(*p),这个就改变了原来的数组的第二个元素,此时a[]={0,2,2,3,4,5,6},后面的就不解释了,再次说一次,指针的移位只需要:p++

    这里有必要对自己规范一下,为了避免第二个元素那种被偷偷改变,以后,碰到指针移动位置都加上括号。

 

3、运算符优先级

     运算符优先级,是一个很容易出错的,看例子

int a=3;a+=a-=a*a;      (*)>(-=)>(+=)       所以此表达式的结果是-12

 

4、指针数组

int a[10][4];      int (*p)[4];

p=a;

printf("%d",*p[1]);//此时应该打印出*p[1]=a[1][0],*p[1]+1=a[1][1]...

要记住的是,数组指针中有p[0]-p[9],,不要以为只有p[0]-p[3]

特别要注意的是::::*p[1]=a[1][0],但是但是但是但是(*p)[1]=a[0][1],,有例子为证

void main()

{int a[4][3]={1,1000,3,4,5,6,7,8,9,10,11,12};     int (*p)[3];

p=a;

printf("%d,%d,%d,%d\n",*p[0],*p[1],*p[2],*p[3]);    //1,4,7,10

printf("%d,%d,%d",*p[0]+1,*(p[0]+1),++*p[0]);       //2,1000,1001,此时数组变为了{1,1001,3,4,5,6,7,8,9,10,11,12}

//下面的就要注意了

printf("%d,%d,%d",(*p)[0],(*p)[6],(*p)[10])        //1,7,11,看到了吧,此时上面定义的时候好像只有3个,但是实际上有12个

}

 //特别说明下,,,我不晓得为什么*(p[0]++)这样表达会报错

5、sizeof()和strlen()

       对于sizeof()和strlen(),没什么好说的,请看例子

char a[]="my\0haa";

char b[]="123\089";

printf("%d,%d",sizeof(a),strlen(b));         //7,2

printf("%d,%d",sizeof(a),strlen(b));        //7,3,结论是strlen()遇到'\0'返回,而且不会计算'\0'占用的地方,但是sizeof()会将所有的都计算进去

        易错点。。1、sizeof()经常会拿来计算数组指针之类的,记住,只要是指针类型就是4,

                      2、如果一个字符串声明的时候,未定义,那么,可能用strlen得到的是一个不相关的数字,如下:int a[10];printf("%d",a);//我的机器的出来的是15.他是往后面直到遇到'\0'

 

6、转义字符

       转义字符在一些考试中长期用到。。

记住常用的:或者说直到他是一个转义字符即可

重点提示:::\0后面不要接数字,因为如果接了数字的话可能就会出现桃杏梅方或者是笑脸之类的了,,,很恶搞的

     

posted on 2012-04-27 15:20  轻歌曼舞  阅读(196)  评论(0编辑  收藏  举报