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后面不要接数字,因为如果接了数字的话可能就会出现桃杏梅方或者是笑脸之类的了,,,很恶搞的
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后面不要接数字,因为如果接了数字的话可能就会出现桃杏梅方或者是笑脸之类的了,,,很恶搞的
相关文章推荐
- C语言分配内存时一个容易被忽视的坏习惯。
- Javascript 容易忽视的语法点
- 黑马程序员-Java学习笔记之容易让人忽视的环境变量配置和语法基础
- C语言中一些容易忽视的细节
- js基本语法中容易忽视的几个地方
- 初学C语言时在语法和语义上容易犯的一些错误
- 黑马程序员——C语言学习笔记01 一部分容易忽视的概念
- 黑马程序员_C语言类型方面初学者容易忽视的几个知识点
- HttpClient容易忽视的细节――连接关闭
- SQL开发中容易忽视的一些小地方(二)
- SQL开发中容易忽视的一些小地方( 三)
- C语言的指针的基本语法
- 初学HTML过程中容易忽视的知识小点
- java中容易被忽视的基本概念
- c语言文件操作流容易犯的错误
- C编译器剖析_3.1 语法分析_C语言的表达式(1)
- Vi 编辑器容易被忽视的细节
- 那些容易被忽视但又非常重要的安全知识
- C语言,C++所忽视掉的一般数据的类型
- shell 语法与C语言对比