2012-02-14 9 views
8

[C++]は、IDEとしてコード::ブロック10.05で:ライン7でISO C++はポインタと整数の比較を禁じます[-fpermissive] |私はUbuntuの(64ビット)に以下のコードをコンパイルしようとしています

#include <iostream> 
using namespace std; 
int main() { 
    char a[2]; 
    cout << "enter ab "; 
    cin >> a; 
    if (a == 'ab') // line 7 
    { 
     cout << "correct"; 
    } 
    return 0; 
} 

、私のコンパイラは私にエラー「ISO Cを与える++ポインタと整数[-fpermissive]の比較を禁じます。

なぜこれは機能しませんか?問題を回避するためにstd::stringを使用することができますが、現在の問題を理解したいと思います。

+4

「ab」はintで、「ab」は文字の配列です。 – avakar

答えて

12

char a[2]charの配列を定義します。 aは配列の先頭のメモリへのポインタであり、==は実際には同じタイプではないため、'ab'が整数型であるため、実際にaの内容と'ab'の内容を比較しません。また'ab'"ab"でなければなりません。 strcmpを使いたいcharの配列を比較する。説明のかもしれない何かが'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; 
} 

これが返されます:'ab'が実際にint型として評価されていることを示す

i 
i 

を。

std :: stringで同じことをする場合は、クラスとstd :: stringにはoperator ==がオーバーロードされており、このように呼び出されたときに比較チェックが行われます。

あなたは私はあなたがそうのようにそれを行う示唆++方法cは慣用的に文字列「AB」と入力を比較したい場合:ここでは、

if(a=='ab')

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    string a; 
    cout<<"enter ab "; 
    cin>>a; 
    if(a=="ab"){ 
     cout<<"correct"; 
    } 
    return 0; 
} 
+1

実際の問題ではなく、正しくありません( 'a'は' sizeof(a) 'で見ることができるように配列です)。 –

+0

私は、書式設定はここで少し混乱していると私は言ったと思う。 – shuttle87

+0

編集し、うまくいけば物事をより明確にします。 – shuttle87

5

この1つはのためにあります、aconst char*タイプ(つまり:charの配列)

'ab'は定数値であり、(一重引用符のために)文字列として評価されませんが、整数として評価されます。

charはCから継承したプリミティブ型なので、演算子==は定義されていません。

良いコードは次のようになります。

if(strcmp(a,"ab")==0)、あなたはstrcmpを使用して別のconst char*const char*を比較します。

+5

未定義の動作がない限り、 'strcmp(a、" ab ")'は '0'を返すことができません。 'a'は' char [2] '型を持っています。したがってCスタイルの文字列の中で一番長いものは1文字です。それ以上のことは、未定義の動作があります。 –

+0

実際には、文字列の最後のNUL文字を含むことができるためには、少なくとも3文字長でなければなりません。しかし、この2バイト配列を格納するためのコンパイラの配置によって、変数の隣接する2バイトのメモリが0になる可能性があります。プログラマーの間違いにもかかわらず、コードは「機能しています」。 – dweeves

+0

私は理解しています。ありがとうございます – iyazici

関連する問題