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'根本没有警告。谁能解释一下原因?另一个奇怪的事情是我根本没有使用指针。

我知道以下问题

但在我看来,它们与我的问题无关。

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' 是一个计算为字符的文字表达式。"\n" 是一个计算结果为指针的文字表达式。因此,通过使用此表达式,您实际上是在使用指针。

有问题的指针指向一个内存区域,该区域包含一个字符数组(在本例中为 \n),后跟一个终止字符,告诉代码数组在哪里结束。

希望有帮助吗?

于 2012-10-24T01:26:48.890 回答