您的位置:首页 > 编程语言 > C语言/C++

c语言语法容易忽视点

2012-04-27 15:20 162 查看
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后面不要接数字,因为如果接了数字的话可能就会出现桃杏梅方或者是笑脸之类的了,,,很恶搞的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: