ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]

Posted

技术标签:

【中文标题】ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]【英文标题】:ISO C++ forbids comparison between pointer and integer [-fpermissive]| [c++] 【发布时间】:2012-02-14 16:57:04 【问题描述】:

我正在尝试在 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 来解决这个问题,但我想了解当前的问题。

【问题讨论】:

请注意,'ab' 是一个 int,而 "ab" 是一个字符数组。 这能回答你的问题吗? ISO C++ forbids comparison between pointer and integer [-fpermissive] 【参考方案1】:

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

查看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;

在我的系统上返回:

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;

【讨论】:

不太正确(a 是一个数组,正如您在 sizeof(a) 中看到的那样),而不是实际问题。 我想我说过,我认为这里的格式有点混乱。 我以为 char a[13124]; 没有区别和字符串 a; @İbrahimYazıcı:std::string 实际上是一个包含字符串的类。使用 std::string 的好处包括无需过多担心底层数据的内部表示或内存管理。这样可以更轻松地编写无错误代码,还可以帮助您提高工作效率,因为您不必花太多时间担心平凡的细节。【参考方案2】:

这是由于:

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

'ab' 是一个常量值,它不会被评估为字符串(因为单引号),而是会被评估为整数。

由于char 是从C 继承的基本类型,因此没有定义运算符==

好的代码应该是:

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

【讨论】:

除非存在未定义的行为,否则strcmp( a, "ab" ) 不能返回0a 具有 char[2] 类型,因此它可以包含的最长 C 样式字符串是 1 个字符。再多的话,你就会有未定义的行为。 确实,a 应该至少有 3 个字符长才能包含字符串的最终 NUL 字符。但是,存储此 2 个字节数组的编译器对齐可能导致 0 填充相邻的 2 个字节a 变量的内存,从而使代码“工作”,尽管程序员的错误。 我明白了。非常感谢 Padding 可能会为您节省时间。直到用户在输入之前靠在空格键上。输入的第一条规则:期待任何东西,即使它不合理。 (第二个是始终允许前导和尾随空格。人们有时会不小心按空格键,如果它在开头或结尾,他们看不到。)【参考方案3】:

在 DEVC++ 中,我遇到了同样的问题,我得到了解决方案。 我用单引号代替双引号。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]的主要内容,如果未能解决你的问题,请参考以下文章

Qt错误iso c++禁止指针和整数之间的比较-fpermissive

出现错误:“ISO C++ 禁止指针和整数 [-fpermissive] 之间的比较”如何解决?

共享内存 - 警告:指针和整数之间的比较

菜单的C“指针和整数之间的比较”警告

ISO C++ 禁止声明没有类型的“myStruct”

ISO C++ 禁止声明没有类型的“堆栈”