如果 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
。与比较相同,您将 char
与 char*
.
进行比较
对于初始化和比较,您必须在字符周围使用单引号,
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'
.
我是 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
。与比较相同,您将 char
与 char*
.
对于初始化和比较,您必须在字符周围使用单引号,
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'
.