ISO C++禁止指针和整数之间的比较 [-允许]|[C++]
ISO C++ forbids comparison between pointer and integer [-fpermissive]| [c++]
我正在尝试在Ubuntu(64位(上编译以下代码,代码::Blocks 10.05作为IDE:
#include <iostream>
using namespace std;
int main() {
char a[2];
cout << "enter ab ";
cin >> a;
if (a == 'ab') // line 7
{
cout << "correct";
}
return 0;
}
在第 7 行,我的编译器给了我错误"ISO C++禁止指针和整数 [-fpermissive] 之间的比较"。
为什么这不起作用? 我知道我可以使用std::string
来解决问题,但我想了解当前的问题。
char a[2]
定义了char
的数组。 a
是指向数组开头内存的指针,使用 ==
实际上不会将 a
的内容与 'ab'
进行比较,因为它们实际上不是相同的类型,'ab'
是整数类型。另外'ab'
应该"ab"
否则你也会在这里遇到问题。要比较字符数组,您需要使用 strcmp。
可能说明的事情是查看'ab'
typeid
:
#include <iostream>
#include <typeinfo>
using namespace std;
int main(){
int some_int =5;
std::cout << typeid('ab').name() << std::endl;
std::cout << typeid(some_int).name() << std::endl;
return 0;
}
在我的系统上,这将返回:
i
i
表明'ab'
实际上被评估为 int。
如果你要对 std::string 做同样的事情,那么你将处理一个类,并且 std::string operator ==
重载,并以这种方式调用时将进行比较检查。
如果您希望以惯用的c ++方式将输入与字符串"ab"进行比较,我建议您这样做:
#include <iostream>
#include <string>
using namespace std;
int main(){
string a;
cout<<"enter ab ";
cin>>a;
if(a=="ab"){
cout<<"correct";
}
return 0;
}
这是由于:
if(a=='ab')
,在这里,a
是const char*
类型(即:字符数组(
'ab'
是一个常量值,它不计算为字符串(因为单引号(,但将计算为整数。
由于 char
是从 C 继承的基元类型,因此未定义运算符==
。
好的代码应该是:
if(strcmp(a,"ab")==0)
,您将使用 strcmp
将一个const char*
与另一个const char*
进行比较。
在 DEVC++ 中,我遇到了同样的问题,我得到了解决方案。我使用单引号而不是双引号。
在你的代码中,你写了 char a[2]; 这是错误的。你写了字符* a[2];然后,您可以获得正确的输出。
- 如何只允许用户输入正整数
- 控制允许动态运行c++的并发操作数
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 允许从 std::map 的密钥窃取资源?
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 为什么 Clang 不允许"and"作为函数名称?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 在noexcept 规范中是否允许使用"this"?
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 对象初始化中是否允许指向此成员的指针?
- 如何允许大写和小写用户输入?
- 为什么函数声明中允许 const?
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动