4

私はCコードの次の部分を持っています:

char c;
int n = 0;
while ( (c = getchar()) != EOF ){
    if (c == "\n"){
        n++;
    }
}

コンパイル中にコンパイラが教えてくれる

warning: comparison between pointer and integer [enabled by default]

問題は、置き換え"\n"'\n'も警告がまったくないということです。誰でも理由を説明できますか?もう 1 つの奇妙な点は、ポインターをまったく使用していないことです。

私は次の質問を知っています

しかし、私の意見では、それらは私の質問とは無関係です。

PS。代わりに警告が表示さchar cれる場合があります。int c

4

2 に答える 2

8
  • '\n'文字リテラルと呼ばれるスカラー整数型です。

  • "\n"文字列リテラルと呼ばれ、配列型です。配列はポインターに減衰するため、そのエラーが発生することに注意してください。

これはあなたが理解するのを助けるかもしれません:

// analogous to using '\n'
char c;
int n = 0;
while ( (c = getchar()) != EOF ){
    int comparison_value = 10;      // 10 is \n in ascii encoding
    if (c == comparison_value){
        n++;
    }
}

// analogous to using "\n"
char c;
int n = 0;
while ( (c = getchar()) != EOF ){
    int comparison_value[1] = {10}; // 10 is \n in ascii encoding
    if (c == comparison_value){     // error
        n++;
    }
}
于 2012-10-24T01:22:00.260 に答える
0

基本的に「\n」は、char に評価されるリテラル式です。"\n" は、ポインターに評価されるリテラル式です。したがって、この式を使用すると、ポインターを効果的に使用できます。

問題のポインターは、文字の配列 (この場合は \n) の後に配列の終了位置をコードに示す終了文字が続くメモリ領域を指しています。

それが役立つことを願っていますか?

于 2012-10-24T01:26:48.890 に答える