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

Thu*_*che 10 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;
}
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)


dwe*_*ves 6

这个是由于:

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

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

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

好的代码应该是:

if(strcmp(a,"ab")==0),然后你将比较一个使用const char*另一个.const char*strcmp

  • 除非存在未定义的行为,否则`strcmp(a,"ab")`不能返回"0".`a`的类型为`char [2]`,因此它可以包含的最长C样式字符串是1个字符.还有更多,你有未定义的行为. (5认同)

Raj*_*ngh 5

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