三、嵌入式C语言的应用

嵌入式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 文件,并生成对应的注释文档

未完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值