新手入门请问,关于赋值运算的有关问题
新手入门请教,关于赋值运算的问题
最近遇到一个问题,没有想的太清楚,虽然问题解决了,但希望有高手帮助解决分析原因,谢谢!
程序简单如下:
int n;
float s;
n=5;
s=1;
s=s+1/n;
计算后s的值一直显示为1不变,多次调试后发现将n定义为float型后计算正确,不知原因为何,是不是整型数定义的问题?
------解决思路----------------------
整数的除法结果只取整数部分。
------解决思路----------------------
因为 1/5 等于 0
s+0 等于 s
------解决思路----------------------
c++中除法会转换成精度最高的类型进行运算:a/b,结果为最高精度的类型。
假如是double和float类型进行除法,会统一转换成double,除法结果为double类型。
s=s+1/n; 1是int型,n是int型,1/n结果也是int型,会发生下取整。 s+1/n,s是float类型,1/n是int型,把1/n的下取整结果转换成float型,和s相加,结果为float类型。
int n;
n=n+1.0/(n); //warning C4244: “=”: 从“double”转换到“int”,可能丢失数据 //这里1.0/n的结果是double类型。
高精度类型向低精度类型转换,会发生精度丢失的警告。
------解决思路----------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
最近遇到一个问题,没有想的太清楚,虽然问题解决了,但希望有高手帮助解决分析原因,谢谢!
程序简单如下:
int n;
float s;
n=5;
s=1;
s=s+1/n;
计算后s的值一直显示为1不变,多次调试后发现将n定义为float型后计算正确,不知原因为何,是不是整型数定义的问题?
------解决思路----------------------
整数的除法结果只取整数部分。
------解决思路----------------------
因为 1/5 等于 0
s+0 等于 s
------解决思路----------------------
c++中除法会转换成精度最高的类型进行运算:a/b,结果为最高精度的类型。
假如是double和float类型进行除法,会统一转换成double,除法结果为double类型。
s=s+1/n; 1是int型,n是int型,1/n结果也是int型,会发生下取整。 s+1/n,s是float类型,1/n是int型,把1/n的下取整结果转换成float型,和s相加,结果为float类型。
int n;
n=n+1.0/(n); //warning C4244: “=”: 从“double”转换到“int”,可能丢失数据 //这里1.0/n的结果是double类型。
高精度类型向低精度类型转换,会发生精度丢失的警告。
------解决思路----------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。