语法“陷阱”:语法是在词法的基础上延伸,它教怎样组合成声明,表达式,语句和程序
- 理解函数声明
任何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;
}
-
运算符的优先级问题
() 最高
算术运算符 其次
关系预算符 再次之
逻辑预算符 再再次之以上是比较常用预算符,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语言中的小细节,它会让你在调试的时候,花费大量的时间,那为何不养成好的习惯,
来避免这些问题呢?