c陷阱与缺陷:语法“陷阱

语法“陷阱”:语法是在词法的基础上延伸,它教怎样组合成声明,表达式,语句和程序

  1. 理解函数声明
    任何c变量声明都是由: 类型 + 一组类似表达式的声明符

	float f;//一个简单的变量声明
	
	float f();  //这是一个函数声明,其返回值 float类型的函数
	
	float *f; //这是一个指向float类型的指针
	
	float  *f();   //这是一个指针函数,其返回值是一个指向float类型的指针
	
	float  (*f)();  //这是一个函数指针 ,其返回值是一个float 类型的值
	
	函数指针和指针函数区别:
		由于()的优先级比 *的高, *f()运行时实际上是这样的(*f()),指针函数的本质是一个函数,
		其返回值是float。
		
		而如果用括号包住 *f 也就是这样(*f)() 形式,就成为函数指针,其本质是一个指针变量,只不过这
		个变量是函数而已,由于括号把*f封装,其返回值是float值,而不是一个指针
	
回调函数:把一个函数的入口地址传递给一个函数指针,通过函数指针去调用这个函数,
#include<stdio.h>
void callBack(int n)
{
	printf("i`m %d\n",n);
}

int main()
{
	void (*call)(int ); //这里定义一个和callBack函数相同 “返回值”和“参数”
	call = callBack;
	callBack(18);  		  //  打印结果 :i`m 18
	(*call)(19);		 //  打印结果 :i`m 19
	call(20);			//  打印结果 :i`m 20 
					   //这三条语句效果相同
	return 0;
}
  1. 运算符的优先级问题
    () 最高
    算术运算符 其次
    关系预算符 再次之
    逻辑预算符 再再次之

     以上是比较常用预算符,c语言有很多预算符,每个都记住不是那么容易,再者记住作用也不大, 
     对于比价模糊的优先级可以用()把表达式封装起来
    

3.注意作为语句结束标志的分号
在c如果不小心多打了分号,可能无伤大雅,也可能导致你的代码不是你想要的样子

//多打分号
		int i=0;; //这样编译器会把他当成不会产生实际效果的空语句

		if(a[i]>max);  //注意这里多了一个分号 ,然后max=a[i]; 这条语句不管if条件是真是假都执行
			max=a[i];
//少打分号
	struct class
	{
		int number;
		char name;
		int age;
	}	    //注意这里少打了个分号     这样main函数返回值就变成了struct class 类型
	main()
	{
		。。。
	}

4.switch 语句

		switch( num ) //  num 是一个整形常量
				case 1:
						printf(“1”);
						break;   //别忘记了,不然 可是要把 2 也一起打印出来的
				case 2:
						printf(“2”);
						break;

5 . 函数调用:

	#include<stdio.h>
		void callBack(int n)     //声明函数
		{
			printf("i`m %d\n",n);
		}
	
		int main(
		{
				callBack(18);//调用函数
		})

6 . 悬挂 else 问题

if(x == 0)
			if(y==0) error();
else
{
	z=x+y;
}

//c语言规定:else始终与同一括号内最近的未匹配的if结合
上面的代码编译器是如下结果:

if(x == 0)
				if(y==0) error();
				else
				{
					z=x+y;
				}

也就是说else 是和判断表达式位y==0结合,而不是和x = =0;
所以时常给if加上花括号是种好习惯

if(x == 0)
{
	if(y==0) error();
}
else
{
	z=x+y;
}

最后,请多多留言c语言中的小细节,它会让你在调试的时候,花费大量的时间,那为何不养成好的习惯,
来避免这些问题呢?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值