论坛风格切换切换到宽版
  • 2635阅读
  • 8回复

探讨一个关于C的问题 [复制链接]

上一主题 下一主题
离线代洪波
 
发帖
4809
只看楼主 倒序阅读 0楼 发表于: 2009-05-25
最近写了个程序,是控制pll的,有一句程序是这样的:
tf=tf+(ttf/125*2)%64;
但是程序在执行的时候并没有把tf原来的值加进去,
而只是给出了后面运算式的值,后来改成:
tf+=(ttf/125*2)%64;
这样才算解决!不知何故?
离线bd5ham
发帖
1793
只看该作者 1楼 发表于: 2009-05-25
根据 c 语言的语法上面的两个语句作用是相同的,否则可能是编译器的问题了
离线FMer
发帖
2549
只看该作者 2楼 发表于: 2009-05-25
tf=tf+((ttf/125*2)%64);
这样试试.
离线BH7KQK
发帖
3425
只看该作者 3楼 发表于: 2009-05-25
代局长厉害啊,会用c,我才开始学basc呢。
离线BH7KQK
发帖
3425
只看该作者 4楼 发表于: 2009-05-25
好象应该叫basic吧,看看我这菜样,刚看了两天书学编程,连名字都没记住…
呵呵…代书记有空要指点一下啊!
离线代洪波
发帖
4809
只看该作者 5楼 发表于: 2009-05-25
c这个东西的确很深啊,主要是我english不怎么样,很多帮助文件看不懂,所以大家见笑了。
离线永远的FM
发帖
12113
只看该作者 6楼 发表于: 2009-05-25
波兄还能找到帮助文件!我都是自己眯书的!说起来好像很久没摸c语言了。。。。
离线bd1es
发帖
2096
只看该作者 7楼 发表于: 2009-05-25
我也试了一下,因为看似递推公式,就执行了两次,似乎没发现什么问题,见图。

这个程序中的volatile没什么用处,但我猜如果是做avr的开发,又涉及到在不同任务中更新变量,那把变量修饰成volatile属性的就是必须的了,比如主程序里使用计算结果,而计算是在中断中进行的。乱猜,供参考。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线okstar
发帖
4781
只看该作者 8楼 发表于: 2009-05-25
c语言的算符优先级,+排在%之前
tf=tf+(ttf/125*2)%64 即是 tf=(tf+(ttf/125*2))%64 ,是不是大吃一惊?
因此在c语言的一些书里建议,只要有1个以上的算符,就层层添加括号,以确定表达式的符合开发人员的真正意思。

偶也习惯了,每个表达式必定加括号,特别是条件判断的布尔表达式,检查又检查,避免被默认优先级糊弄,也避免编译器短路求值错误优化