ISO C ++禁止在指针和整数[-fpermissive] |之间进行比较[C ++]

时间:2012-02-14 16:57:05

标签: c++

我正在尝试在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;
}

在第7行,我的编译器给出了错误“ISO C ++禁止在指针和整数[-fpermissive]之间进行比较。”

为什么这不起作用?我知道我可以使用std::string解决问题,但我想了解当前的问题。

4 个答案:

答案 0 :(得分:14)

char a[2]定义了一个char的数组。 a是指向数组开头的内存的指针,使用==实际上不会将a的内容与'ab'进行比较,因为它们实际上不是相同的类型,'ab'是整数类型。另外'ab'应为"ab",否则您也会遇到问题。要比较你想要使用strcmp的char数组。

可能具有说明性的一点是查看typeid的{​​{1}}:

'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;
}

显示i i 实际上被评估为int。

如果你要使用std :: string做同样的事情,那么你将处理一个类,并且std :: string有'ab'重载,并且在这样调用时会进行比较检查。

如果您希望以惯用的c ++方式将输入与字符串“ab”进行比较,我建议您这样做:

operator ==

答案 1 :(得分:5)

这是由于:

if(a=='ab'),此处aconst char*类型(即:char数组)

'ab'是一个常量值,不会被计算为字符串(因为单引号),但会被计算为整数。

由于char是从C继承的原始类型,因此未定义运算符==

好的代码应该是:

if(strcmp(a,"ab")==0),然后您将使用const char*const char*与另一个strcmp进行比较。

答案 2 :(得分:0)

在DEVC ++中,我遇到了同样的问题,并且得到了解决方案。 我使用单引号而不是双引号。

答案 3 :(得分:-1)

在您的代码中,您编写了char a [2];这是错误的。您应该写char * a [2];然后您可以获得正确的输出。