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后面不要接数字,因为如果接了数字的话可能就会出现桃杏梅方或者是笑脸之类的了,,,很恶搞的