如果在写C语言时,代码没错,但是结果总错是什么原因?

龙建源


写c语言的时候,如果代码没错,这只能说明语法没有出错,直接导致的结果就是能编译通过,并不意味着执行的结果就是正确的。影响c语言代码执行结果的因素非常多。

一、指针的不正确运用;

二、变量精度问题。char,int,unsigned int,long ,float等,如果变量精度使用不正确,也会影响运算结果;

三、运算符的应用不正确。例如除,取余的区别;

四、正负符号位;

五、运算符的优先级使用;

六、编译器不同。各种编译器也可能造成结果不一致;

C语言虽然是一门比较简单的语言,但是要掌握这些细节,其实并不容易。


重点吐槽


我是码中寻乐,很高兴能为你解答。

代码没错,估计题主表达的意思是能正常编译通过吧,只要没有语法错误,都会编译通过的,但并不代表代码没错,这是两个概念。结果总是错,说明代码有错误,需要进一步调试排查。

考虑如下代码:

从语法上来讲它们都没有错,能正常编译通过,也能执行。但是输出的结果却跟预估的不一样,看起来结果似乎是错误的?

为什么fv的输出不是5.567891534? 为什么cv的输出不是129?

其实都是有原因的,单精度浮点类型float的小数点后有效位只有6位,后面的会四舍五入; 有符号字符类型的数值表达范围是-128~127, 而此处被赋值129,已经溢出了,按它的二进制布局就是10000001,最高位是符号位,1是负数, 将后面7位取反再加一就是1111111,其值为127,带上符号就是-127。

所以看似错误的结果其实是必然,关键是要自己明白究竟错误的是什么。


码中寻乐


从代码到可执行程序包括以下几个方面:

1.代码编译通过

代码编译通过是生成可执行程序锁必须的,编译不通过则说明代码中有明显的错误,比如类型转换错误、返回值缺失、符号使用错误等等。编译错误在开发环境中一般都能精确定位,是比较容易发现和解决的。代码编译通过,只能说明代码中没有明显的语法错误。

2.可执行程序运行

编译通过后,会生成可执行程序(或者动态库,题主应该说的是可执行程序,所以此处直接说可执行程序),在开发环境中点击“运行”,如果代码没有错误(如内存溢出),一般都能正常显示,如果是黑窗口,则需要在main函数最后添加中断函数,否则会一闪而过。可执行程序能跑起来,则说明代码没有明显的错误。但不代表代码实现了想要的功能。

3.程序的逻辑

在程序开发过程中,如果1和2都没问题,但是程序运行达不到自己期望的结果,那有极大的概率是代码的逻辑有问题,一个细小的逻辑错误,往往会导致莫名其妙的错误,所以,如果程序没达到理想的结果,就仔细研究一下代码的逻辑。

4.其它的问题

以上3个方面几何可以解决90%以上的程序问题,但还有一些莫名其妙的情况,比如函数理解错误,参数设置错误,等等一些不常见的问题。还有一些是疏忽,编码从来都不是一帆风顺的,BUG常伴程序。


天码行空


有一次真实的经历,有一段代码有多种情况分别处理,我是用switch case来写的,结果有一个case始终执行不到,使用调试器跟踪发现,即使条件满足,也无法进入这个case的执行,多次检查代码也没有发现什么问题。最后从周围找了几个高手,也没有发现问题。

真是困惑不解了,后来没有办法了,就把switch case改成if ...else if,问题居然就解决了,真是太神了。

后来想可能是编译器有问题,我们的环境是风河嵌入式系统,编译器也是他们提供的。


黄河边


编程错误不一定是语法错误,也有可能是逻辑错误,语法错误很好排除,逻辑错误很难发现和排除,一行一行debug有时候比重构代码还麻烦。如果是小项目,最好把算法流程画清楚,框架要做到心中有数,大项目的话,老实debug吧


手工浩哥


错误有两种:语法错误和逻辑错误。

前者,编译过程中编译器会报错。

后者,就是程序有错。例如,c语言不做越界检查,数组越界不报错,但结果不正确。还有未初始化就引用值,等等。

所以你的问题本身就是错误,先设定自己没错,再问是谁的错。

软件工程:没有错误是不可能的,唯一不变的就是错误本身。

出了错。先得怀疑一切,一步步排除错误,而不是坚持自己没错。


mubaohong


可能性很多,比如小数点截断,机器位数不同,编译器版本不同,你输入逗号是中文字符,编译器代码检查的要求不同,比如你用c语言的语法编译器标准却是c++11,很多语法都不允许这么写了。


我不是间谍


大概率逻辑问题,很多人很多时候写代码都不喜欢画流程图,结果导致流程中有逻辑细节问题;

小概率环境问题,运行环境不一样,可能导致偏差!


Hdxnx


以我为时不长的7年开发经验告诉你,永远不要先怀疑机器,环境,99.99999%是自己写的bug,不过话说回来,不写bug不就失业了[捂脸][捂脸][捂脸]


爱吃火锅的小青年


显示器坏了


分享到:


相關文章: