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

关于解决ISO C++禁止指针与整数比较编译错误的技术咨询

解决「ISO C++ forbids comparison between pointer and integer [-fpermissive]」编译错误

嘿,我来帮你拆解并修复这个问题!咱们先搞清楚错误根源,再一步步调整代码:

错误原因拆解

  • 指针与整数的非法对比
    你写的while (i != r);里,i是数组名——在C里,数组名会自动退化为指向数组第一个元素的指针(类型是int*),而r是int类型的整数。C标准明确禁止这种跨类型的直接比较,这就是触发编译错误的核心原因。

  • 隐藏的语法/逻辑bug(虽然没触发编译错,但运行起来会出问题)

    • while循环后面多了个分号;:这会让循环体变成空语句,后面的{}代码块只会在这个死循环结束后才执行(但实际上这个循环永远不会结束)。
    • scanf("%d,&i[0]");写法完全错误:scanf要求格式字符串和变量地址分开传参,你把&i[0]写到格式字符串里了,程序根本没法正确读取输入到数组里。

修复后的完整代码

#include <stdio.h>
int main() {
    int i[1];
    int r = 4;
    printf("enter a number between 1-10\n");
    // 修正循环条件:比较数组元素的值而非指针,同时去掉多余分号
    while (i[0] != r) {
        // 修正scanf的传参方式:格式字符串和变量地址分开
        scanf("%d", &i[0]);
    }
    printf("good job\n :)");
    return 0; // 显式返回符合C++规范,main默认返回0但写上更清晰
}

关键修复点说明

  • 把while (i != r);改成while (i[0] != r):直接对比数组第一个元素的数值和r,避免了指针与整数的非法对比,同时去掉多余分号让后续代码块成为循环体。
  • 修正scanf调用:格式字符串"%d"单独作为第一个参数,变量地址&i[0]作为第二个参数传入,这样程序才能正确把用户输入的整数存到数组里。
  • 加上return 0;:虽然C++允许main函数省略返回值,但显式写出更符合规范,也让代码可读性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:50:58