V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
l9mhd
V2EX  ›  编程

在 Code::Blocks 中 c 语言的程序运行结果有误,如何处理?

  •  
  •   l9mhd · 2020-01-22 19:12:28 +08:00 · 3218 次点击
    这是一个创建于 1527 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题

    代码 1

    #include<stdio.h>
    int main(){
    	double a,b;
    
    	a = 0.15;
    	b = (int)( a*10+0.5 );
    	printf("%.1f",b);
    	return 0;
    }
    

    输出 1.0

    代码 2

    #include<stdio.h>
    int main(){
    	double a,b;
    
    	a = 0.15;
    	b = a*10+0.5;
        b = (int)b;
    	printf("%.1f",b);
    	return 0;
    }
    

    输出 2.0

    之后用线上编译器( https://rextester.com/l/c_online_compiler_gcc ) 测试,两段代码结果一致,都是 2.0

    尝试解决

    从官网中重新下载安装,但是问题没有解决,运行结果仍然不一致。

    • 这种情况是什么原因导致的?
    • 我可以做些什么?

    谢谢!

    第 1 条附言  ·  2020-01-22 19:54:11 +08:00

    反编译结果如下:

    Project title : test
    Project path  : F:\test\
    
    Frame function: main (F:\test\main.c:8)
    Frame address : 0x60ff10
    --------------------------------------------------------------------------------
    0x401350	push   %ebp
    0x401351	mov    %esp,%ebp
    0x401353	and    $0xfffffff0,%esp
    0x401356	sub    $0x30,%esp
    0x401359	call   0x401970 <__main>
    0x40135e	fldl   0x403030
    0x401364	fstpl  0x28(%esp)
    0x401368	fldl   0x28(%esp)
    0x40136c	fldl   0x403038
    0x401372	fmulp  %st,%st(1)
    0x401374	fldl   0x403040
    0x40137a	faddp  %st,%st(1)
    0x40137c	fnstcw 0x1e(%esp)
    0x401380	movzwl 0x1e(%esp),%eax
    0x401385	mov    $0xc,%ah
    0x401387	mov    %ax,0x1c(%esp)
    0x40138c	fldcw  0x1c(%esp)
    0x401390	fistpl 0x14(%esp)
    0x401394	fldcw  0x1e(%esp)
    0x401398	fildl  0x14(%esp)
    0x40139c	fstpl  0x20(%esp)
    0x4013a0	fldl   0x20(%esp)
    0x4013a4	fstpl  0x4(%esp)
    0x4013a8	movl   $0x403028,(%esp)
    0x4013af	call   0x401be0 <printf>
    0x4013b4	mov    $0x0,%eax
    0x4013b9	leave
    0x4013ba	ret
    
    des
        1
    des  
       2020-01-22 19:19:43 +08:00 via Android   ❤️ 1
    可以把有问题的程序反汇编了看看
    kokutou
        2
    kokutou  
       2020-01-22 19:41:34 +08:00
    你可以
    1 以后都用代码 2 的写法。
    2 以后都不要强制转类型。
    l9mhd
        3
    l9mhd  
    OP
       2020-01-22 19:56:40 +08:00
    @des 您好!我把代码 1 反编译出来的 txt 复制到附言上了。
    小红点在开头和结尾,然后编译的,不过我不明白这些是什么意思,能麻烦您看一看吗?
    l9mhd
        4
    l9mhd  
    OP
       2020-01-22 20:02:46 +08:00
    @kokutou 我目前正在学习编程,我不太确定这是不是软件的问题,有点担心在代码中出现了这样的情况以后会难以辨别出来。
    关于强制转类型,这段代码,a 赋值输入的内容,b 再除以 10,用于保留小数后一位(四舍五入),在这里强制转类型是用于省略去小数部分的值,我不知道有没有别的实现方式。
    Cielsky
        5
    Cielsky  
       2020-01-22 20:50:29 +08:00 via Android   ❤️ 1
    codeblock 编译器的问题吧,估计是遗留 bug
    调试看了下
    (int)(a~)为 2
    在向 double 类型转换的时候结果错了
    其他编译器试了下没遇到这个问题
    kokutou
        6
    kokutou  
       2020-01-22 20:57:18 +08:00   ❤️ 1
    @l9mhd #4

    https://visualstudio.microsoft.com/vs/community/

    如果要学。。建议用 vs
    如果你能搞定科学上网,那建议 msys2+vscode
    l9mhd
        7
    l9mhd  
    OP
       2020-01-22 21:08:01 +08:00
    @Cielsky 好的,多谢!
    l9mhd
        8
    l9mhd  
    OP
       2020-01-22 21:20:30 +08:00
    @kokutou 我下载了,但是我在语言列表里没找到 c (我现在只学了 c ),感觉还要一段时间学习怎么用😂
    mxalbert1996
        9
    mxalbert1996  
       2020-01-22 21:43:54 +08:00 via Android
    @l9mhd 你至少应该知道 C++完全兼容 C 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   948 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:51 · PVG 05:51 · LAX 14:51 · JFK 17:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.