嵌入式C语言的应用
函数调用不要作为另一个函数的参数使用
int cnt_var;
int fun1(void)
{
cnt_var +=1;
return cnt_var;
}
int fun2(void)
{
cnt_var +=2;
return cnt_var;
}
int main(void)
{
cnt_var=1;
printf("fun1=%d,fun2=%d\n",fun1(),fun2());
cnt_var=1;
printf ("fun2=%d,fun1=%d\n",fun2(),fun1());
return 0;
}
当函数作为参数时,由于参数压栈次数不是代码可以控制的,可能会造成未知的错误输出。
赋值语句不能出现在 if 语句中
由于a==1被满足,b+=a没有得到执行
Q:书中示例b没有赋初值?且a=0,b+=a有没有执行都没有效果呀?
关于优先级
使用括号明确表达式的操作顺序
x = a == b? -b:a;
建议改为
x=( a == b)?(-b):a;
注:因为 == > ?: > =,两句话的意思是一样的
赋值与布尔表达式
如果布尔值表达式需要赋值操作,赋值操作必须在布尔值表达式外分别进行,可避免“=”与“==”的混淆
if( (x = y)!= 0 )
{
fun1();
}
建议改为
x = y;
if (x != 0)
{
fun1();
}
补充:布尔值表达式,即计算结果为0或1
同第二点,赋值语句尽量不要放在逻辑计算式中,区分==和=
性能优化-减小运算强度
(1)查表法
(2)使用位操作:取余,交换,乘除运算(多积累?)
(3)增、减运算符比赋值语句快得多
性能优化-优化编译
(1)在循环内的重复操作,其执行结果在循环执行期间并不会改变的,放到循环外做
(2)使用无限循环时:for( ; ;) 比while(1)更高效,因为少一条判断条件的指令;但其实很多编译器都是用一条jmp实现循环,没有差别
(3)以空间换时间:如从计算结果数组中取数代替复杂计算(查表法)
Printf的宏定义
程序员在编写和调试的过程需要输出调试信息,而发布时则不输出
需要使用输出语句时打开DEBUG开关,所有的dmsg被替换为printf,没有打开则dmsg被替换成空,因此不被编译(不打开即//掉?)
include <stdio.h>
#define DEBUG //★
# ifdef DEBUG
#define dmsg(format,...) printf (format,##__VA_ARGS)
#else
#define dmsg(format)
#endif //★
int main(void)
{
int i;
while(1)
{
dmsg("hello world i=%d \r\n",i);
i++;
}
}
(有一个error没有解决;宏定义括号内不理解)
撰写一篇标准的 Doxygen 格式的 C 文件,并生成对应的注释文档
未完成