C51程序局部变量赋值错误!
搞不懂为什么会出现这样的情况。造成了死循环。
你这里设置了reentrant ,,,那么相关的配置修改了么0.0 用while(1)循环,然后满足条件break呢?
感觉尽量少使用可重入函数比较好 DebugLab 发表于 2024-7-23 10:49
用while(1)循环,然后满足条件break呢?
感觉尽量少使用可重入函数比较好
嗯,还是用的while。 本帖最后由 tzz1983 于 2024-7-23 22:30 编辑
先去设置一下 启动文件 A51, 跟据编译模式, 打开 IBP, XBP, 相关的功能正确设置.如果还是不行,反汇编看一下. 应该很快能找到原因 是很蹊跷,楼主搞好了过来说一声,感觉挺奇怪的 (1)首先给出正确用法:将“初值语句”改为正常的“变量定义语句”+“赋值语句”即可:
char ns;
------
ns=0;
-------
(2)其次说明:在可重入函数中用初值语句给局部变量赋初始值是一种像裹小脚一样的陋习,可惜满大街的教科书和范例中比比皆是。
(3)再其次祝贺楼主中奖了:C语言有一些著名的“不确定问题”,这是其中的一个。
所谓不确定问题是指对同一个C语言程序,它的意义不同的人有不同的理解,并且使用不同的编译器进行实际运行会到不同的结果。
(4)有些C语言的不确定问题通过抽象强制的语法规则来消除不确定性,这些已成为C语言等级考试的嘚瑟亮点,比如:Z=X+++Y;
究竟是Z=(X++)+Y;还是Z=X+(++Y);呢,正确答案是前者。
(5)似乎加括号就可以了,但是:
X=1;
Z=(X++)+(X++)+(X++);
请问Z等于几?不同的编译器得到的结果不同,不同的读者给出的结果也不同.
不信的可以去试试C51、C251、MDK、VC、TC、BC和GCC,看看是不是一样。感兴趣的可以把结果分享上来。
(6)最后回到本篇问题:当楼主在写出初值语句“char ns=0;”的时候,楼主心里是怎么想的?
是想在“main”函数执行前执行一次“ns=0”呢?还是想在“main”函数执行时执行一次“ns=0”呢?
又或者是想在“food”函数第一次执行开始时执行一次“ns=0”呢?还是想在“food”函数每次开始执行时都执行一次“ns=0”呢?
既然有4种可能,Keil编译器怎么能猜中楼主的心呢,当然猜错总是难免的了。
(7)我猜想楼主和大多数人的想法都是:想在“food”函数每次开始执行时都执行一次“ns=0”,
因此就给出了本楼开始的答案,在“food”函数一开始就直接来一句“ns=0;”,这样就不会有任何异议了。
当然我也有可能猜错,前面给出的答案就不一定正确。
(8)由于设计时我确定“长缨351”C语言编译器的语法要像GCC和VC等C语言一样,所有函数都是可重入的,因此我写的时候很多次的想拒绝支持“局部变量的初始值语句”,但是我看到众多的教科书中都有这种语句,因此才保留了这个语句。不过为了避免歧义,我将每个初始值语句像(1)中的例子那样,都分解为一个变量定义语句和一个赋值语句,确保每次函数访问时都变量的值确实为初始值。
长知识了{:4_197:}
页:
[1]