关于解决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
相关产品推荐
相关产品推荐

