You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C程序在Code::Blocks编译器运行正常,生成的.exe运行后崩溃?

问题分析与修复

你的计算器程序存在两处逻辑错误,同时可能因编译器链接设置导致单独运行exe时崩溃:

1. 代码逻辑错误

错误1:退出判断顺序颠倒

你在判断selection < 1 || selection > 4之后才检查selection == 0,导致输入0时会直接触发"无效操作"提示并退出程序,无法执行正常的退出逻辑。

错误2:循环内的return 0导致程序提前终止

main函数中的return 0;写在while(1)循环内部,第一次计算完成后程序就会直接退出,无法实现循环计算的功能。这也可能让你误以为程序崩溃(实际是正常退出,但不符合预期)。

2. 编译器链接设置问题

如果代码逻辑修复后仍崩溃,大概率是Code::Blocks的编译链接设置导致:默认情况下MinGW的release模式会使用动态链接库(如libgcc_s_dw2-1.dll、libstdc++-6.dll),单独运行exe时如果这些DLL不在同一目录或系统路径中,就会触发崩溃。

解决方法:

  • 在Code::Blocks中打开项目设置,找到编译器设置 -> 链接器设置,添加-static-libgcc和-static-libstdc++参数,强制静态链接依赖库,生成不依赖外部DLL的独立exe。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

float Add(float num1, float num2){
    return num1 + num2;
}

float Subtract(float num1, float num2){
    return num1 - num2;
}

float Multiply(float num1, float num2){
    return num1 * num2;
}

float Divide(float num1, float num2){
    return num1 / num2;
}

int main()
{
    while(1){
        int selection;
        float num1, num2, answer;
        char* selectionNames[] = {"Addition", "Subtraction", "Multiplication", "Division"};

        printf("Select Function from List:\n1: Addition\n2: Subtraction\n3: Multiplication\n4: Division\nSelection: ");
        scanf("%d", &selection);

        // 先处理退出逻辑
        if (selection == 0) {
            printf("Exiting...\n");
            break;
        }

        // 再检查是否为有效操作
        if(selection < 1 || selection > 4) {
            printf("Please choose a valid operator!\n");
            continue; // 回到循环开头,重新选择
        }

        printf("You have Selected %s\n\n", selectionNames[selection-1]);

        printf("Enter First Number: ");
        scanf("%f", &num1);
        printf("Enter Second Number: ");
        scanf("%f", &num2);

        switch (selection){
        case 1:
            answer = Add(num1,num2);
            printf("\nAnswer = %.2f\n", answer);
            break;
        case 2:
            answer = Subtract(num1,num2);
            printf("\nAnswer = %.2f\n", answer);
            break;
        case 3:
            answer = Multiply(num1,num2);
            printf("\nAnswer = %.2f\n", answer);
            break;
        case 4:
            if (num2 == 0) {
                printf("Cannot divide by zero!\n\n");
                continue;
            }
            answer = Divide(num1,num2);
            printf("\nAnswer = %.2f\n", answer);
            break;
        }
    }
    return 0; // 将return移到循环外,程序正常退出
}

内容的提问来源于stack exchange,提问作者TJP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:40:28