c语言编程哪里错了
如果在写C语言时,代码没错,但是结果总错是什么原因?
我是码中寻乐,很高兴能为你解答。
代码没错,估计题主表达的意思是能正常编译通过吧,只要没有语法错误,都会编译通过的,但并不代表代码没错,这是两个概念。结果总是错,说明代码有错误,需要进一步调试排查。
考虑如下代码:
从语法上来讲它们都没有错,能正常编译通过,也能执行。但是输出的结果却跟预估的不一样,看起来结果似乎是错误的?
为什么fv的输出不是5.567891534? 为什么cv的输出不是129?
其实都是有原因的,单精度浮点类型float的小数点后有效位只有6位,后面的会四舍五入; 有符号字符类型的数值表达范围是-128~127, 而此处被赋值129,已经溢出了,按它的二进制布局就是10000001,最高位是符号位,1是负数, 将后面7位取反再加一就是1111111,其值为127,带上符号就是-127。
所以看似错误的结果其实是必然,关键是要自己明白究竟错误的是什么。
编程错误不一定是语法错误,也有可能是逻辑错误,语法错误很好排除,逻辑错误很难发现和排除,一行一行debug有时候比重构代码还麻烦。如果是小项目,最好把算法流程画清楚,框架要做到心中有数,大项目的话,老实debug吧
错误有两种:语法错误和逻辑错误。
前者,编译过程中编译器会报错。
后者,就是程序有错。例如,c语言不做越界检查,数组越界不报错,但结果不正确。还有未初始化就引用值,等等。
所以你的问题本身就是错误,先设定自己没错,再问是谁的错。
软件工程:没有错误是不可能的,唯一不变的就是错误本身。
出了错。先得怀疑一切,一步步排除错误,而不是坚持自己没错。
很高兴回答答主的问题,希望我的回答对答主有帮助。
根据您的描述,首先排除您的代码语法上出现错误,因为这种错误在代码编译时,编译器就会报错,这种错误相对容易好找。
然后就是查找代码逻辑上的错误,将自己的构思通过画流程图展示出来,然后将程序运行的流程和自己的构思流程对照是否吻合。
之后再查询字段的数据类型是否正确,比如如果存储类型为小数时,必须定义为float或double类型,否则显示结果肯定跟预期的完全不一样。
最后如果还是程序运行错误,那么恭喜你,发现了编译器的BUG了!🤫
对于我们经常在单片机开发过程中,使用C语言编程的人来说,会经常遇到代码没错,编译能够通过,没有报错。但功能没有达到预期的情况。
编译不出错,可以肯定语法没有问题,那么我们分析下,有可能有一下几种情况:
char类型是-128~127,unsigned char 的范围是0-255
int 类型是-32768~32767。unsigned int的范围 0-65525
***如你本来预期的变量范围是1000,必须使用unsigned int,但定义的是 unsigned char变量 类型,如果按照如下的代码,就没有办法执行条件发生后的结果。
有时在函数中,需要使用static 静态变量,表示变量运算的值不能丢失,但***如定义变量类型时,忘记添加static 关键字时,则每次运行函数完后,都会被清零。
有时候,变量需要清零的状态,没有进行赋值。当变量处理完成后,需要清零从新开始计算,***如这个时候,忘记清除这个变量,则肯定没办法完成预想的程序执行逻辑。也就出不来正确的结果了。
C语言程序开发中,难免会出现逻辑错误,怎样让程序自己输出错误位置呢?
谢邀。
在C语言程序开发中,程序员常常会把一个复杂的任务拆分成若干个较为简单的子模块,这些子模块可以看做是复杂任务的各个组成部分。因此,程序员将子模块逐个完成后,就可以将其像“积木”一样搭建起来,进而解决复杂任务。
之所以要这么做,是因为若直接编写C语言代码一次性解决复杂任务,往往会让整个代码“揉作一团”,不仅开发时容易引入 bug,而且后期维护起来也比较痛苦。想象一下,若将任务拆分成若干个子模块,以后发现问题时,可能只需要修改某个子模块就可以了。但是若没有这么做,查找和解决问题就必须对全部代码下手了。哪一种开发风格维护起来方便,相信题主自然明白。
将任务拆分成子模块后,每个子模块常常被封装成一个C语言函数,所以,最后的“堆积木”其实就是调用各个C语言函数。不过,每一个子模块都有可能得到正常结果,也有可能得到异常结果,这通常用C语言函数的返回值区分。在“堆积木”阶段调用各个函数时,应该根据被调用函数的返回值做不同的处理。
例如,某个子模块负责计算用户输入数字的 log(对数) 值时,如果用户输入的是正数,则该子模块能够得到正常的结果。但如果用户输入的是负数,子模块显然就无法得到正常结果了。
这里的例子C语言代码尽可能的简单,是为了将重心放在讨论主题上:
cond() 函数产出 0~10 的随机数,如果随机数小于 5 就返回 -1(模拟异常结果),否则返回 0(模拟正常结果)。fun1() 函数和 fun2() 函数都会根据 cond() 函数的返回值做一些进一步的工作(上面的C语言代码略过了“进一步工作”)。在 main() 函数中“堆积木”调用 fun1() 和 fun2() 函数时,使用了 if 语句判断它们的返回值,并且根据返回值做了不同的处理。
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。转载请注明出处:http://www.wnpsw.com/post/19982.html