我试图在Ubuntu(64位)上编译以下代码,Code :: 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;
}
Run Code Online (Sandbox Code Playgroud)
在第7行,我的编译器给出了错误"ISO C++禁止在指针和整数[-fpermissive]之间进行比较".
为什么这不起作用?我知道我可以用一个std::string来解决这个问题,但我想了解当前的问题.
shu*_*e87 14
char a[2]定义了一个数组char.a是指向数组开头的内存的指针,并且使用==它实际上不会比较awith 的内容,'ab'因为它们实际上不是相同的类型,'ab'是整数类型.另外也'ab'应该在"ab"这里遇到问题.要比较你想要使用strcmp的char数组.
一件也许说明正在看typeid的'ab':
#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;
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上,它返回:
i
i
Run Code Online (Sandbox Code Playgroud)
显示'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;
}
Run Code Online (Sandbox Code Playgroud)
这个是由于:
if(a=='ab'),这里 a是const char*类型(即:char数组)
'ab' 是一个常量值,不会被计算为字符串(因为单引号),但将被计算为整数.
由于char是从C继承的原始类型,==因此未定义任何运算符 .
好的代码应该是:
if(strcmp(a,"ab")==0),然后你将比较一个使用const char*另一个.const char*strcmp