如果 Else 落在 C 中的变量

If Else falls with variable in C

我是 C 初学者,我不明白为什么这段代码不起作用?

void main(){
    char userInput = "a";

    if(userInput == "a"){
        printf("a");
    } else printf("b");

    getch();
}

returning "b"

但是这个正在工作

void main(){
    char userInput;

    if("a" == "a"){
        printf("a");
    } else printf("b");

    getch();
}

returning "a"

有什么区别?

"a"这样表示的文字是字符串文字。基本类型是 char 的数组,如 char [size]。它不是与 char 兼容的类型,因此赋值

char userInput = "a";

无效。

你想使用字符常量,你写这样的东西

char userInput = 'a';

就是说,if("a" == "a") 似乎适用于您的情况,但它并没有按照您的想法行事。它不比较内容,而是比较字符串的基地址(第一个元素的地址),在您的情况下,它们似乎是相同的。您的编译器恰好将 same 内存位置用于相同的字符串文字(优化)-因此您会看到真实的结果,但标准不能保证这一点。 A(ny) 编译器可以自由选择它自己的内存分配策略,有或没有优化过程。

使用gcc,如果将-fno-merge-constants用作编译选项,则此条件的计算结果应为假。

用 ' 引用字符 所以

char userInput = 'a';

if(userInput == 'a'){

对于 char userInput = "a";,您使用 char* 而不是字符 'a' 来初始化 userInput。与比较相同,您将 charchar*.

进行比较

对于初始化和比较,您必须在字符周围使用单引号,

void main(){
    char userInput = 'a';

    if(userInput == 'a'){
        printf("a");
    } else printf("b");

    getch();
}

忽略无效语法char userInput = "a"(我认为你的意思是char*),那么第一种情况很明显,也是一个常见的常见问题解答:你不是在比较字符串的内容,而是在比较它们的内容地址。参见 How do I properly compare strings?

同样的问题发生在你做"a" == "a"时,你比较字符串的地址。这些只读的"..."常量在C语言中被正式称为string literals

编译器使用一种常见的优化技术,称为 "string pooling"。字符串池是指在程序中多次遇到相同的字符串文字时,编译器只分配其中一个。

所以在你的情况下 "a""a" 恰好是相同的内存地址,因为实际上只分配了一个字符串文字。您可以尝试打印分配字符串文字的实际地址,并查看它们是否相同:

#include <stdio.h>

int main (void) 
{
  printf("%p %p", "a", "a");  

}

简单答案:在 C 中,双引号内的任何内容都是字符串,即以 null 结尾的字符序列。单引号用于单个字符。

示例:

char c = ‘a’ ;

char *str = “string”;

"a" 字符串文字 ,而不是 字符文字 ,应该用单引号引起来,如在 'a'.