如果在C中,我可以用| |代替else吗?

如果在C中,我可以用| |代替else吗?,c,C,我是C语言的新手,我正在努力改进我在一本书中找到的一个程序的源代码。我注意到源代码包含很多“else-if”条件,但结果相同,因此我尝试使用if函数中的| |运算符将它们压缩为较小的代码。 第1代码: #include <stdlib.h> #include <stdio.h> int main(){ char card_name[3]; puts("Enter the card_name: "); scanf("%2s", card_name);

我是C语言的新手,我正在努力改进我在一本书中找到的一个程序的源代码。我注意到源代码包含很多“else-if”条件,但结果相同,因此我尝试使用if函数中的| |运算符将它们压缩为较小的代码。 第1代码:

#include <stdlib.h>
#include <stdio.h>
int main(){
    char card_name[3];
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    if (card_name[0] == 'K'){
        val = 10;
    } else if (card_name[0] == 'Q'){
        val = 10;
    } else if (card_name[0] == 'J'){
        val = 10;
    } else if (card_name[0] == 'A'){
        val = 11;
    } else {
        val = atoi(card_name);
    }
    printf("The card name value is %i\n", val);
    return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]=“K”){
val=10;
}else if(卡片名称[0]=“Q”){
val=10;
}else if(卡片名称[0]=“J”){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}
我的进步:

#include <stdlib.h>
#include <stdio.h>
int main(){
    char card_name[3];
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    if (card_name[0] == 'K' || 'Q' || 'J' ){
        val = 10;
    } else if (card_name[0] == 'A'){
        val = 11;
    } else {
        val = atoi(card_name);
    }
    printf("The card name value is %i\n", val);
    return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | | Q'| | J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}

我的问题是:当我写任何其他值时,它总是提示10。我该怎么办?

问题在于
C
任何不是
0
的东西都是真实的值,因此在你的代码中你有
if(card_name[0]='K'| Q'| J')
。这将检查卡名[0]='K'是否为真,但这将始终计算为真,因为您有
|Q'
C
'Q'
视为真值。这是正确的解决办法

#include <stdlib.h>
#include <stdio.h>
int main(){
    char card_name[3];
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
        val = 10;
    } else if (card_name[0] == 'A'){
        val = 11;
    } else {
        val = atoi(card_name);
    }
    printf("The card name value is %i\n", val);
    return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | |卡片名称[0]='Q'| |卡片名称[0]='J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}

问题在于
C
任何不是
0
的东西都是真实的值,因此在你的代码中你有
如果(卡名[0]='K'| Q'| J')
。这将检查卡名[0]='K'是否为真,但这将始终计算为真,因为您有
|Q'
C
'Q'
视为真值。这是正确的解决办法

#include <stdlib.h>
#include <stdio.h>
int main(){
    char card_name[3];
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
        val = 10;
    } else if (card_name[0] == 'A'){
        val = 11;
    } else {
        val = atoi(card_name);
    }
    printf("The card name value is %i\n", val);
    return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | |卡片名称[0]='Q'| |卡片名称[0]='J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}

这不是正确的表达式:

(card_name[0] == 'K' || 'Q' || 'J' )
由于'Q'和'J'不是
0
,因此该值将始终为true

你应该写:

(card_name[0] == 'K') || (card_name == 'Q')  || (card_name == 'J')

这不是正确的表达式:

(card_name[0] == 'K' || 'Q' || 'J' )
由于'Q'和'J'不是
0
,因此该值将始终为true

你应该写:

(card_name[0] == 'K') || (card_name == 'Q')  || (card_name == 'J')
if(卡名[0]='K'| | | | | Q'| | J')

应该是

if(卡片名称[0]='K'| |卡片名称[0]='Q'| |卡片名称[0]='J')

'Q'
将始终计算为true,您需要在每个or中进行完整比较。

如果(卡名[0]='K'| | Q'| | J')

应该是

if(卡片名称[0]='K'| |卡片名称[0]='Q'| |卡片名称[0]='J')


'Q'
将始终计算为true,您需要在每个or中进行完整比较。

检查if语句中的运算符优先级。如果你看这里,你会发现,==比| |具有更高的优先级

正确的if语句应如下所示:

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
如果不确定运算符的优先级,可以使用以下括号:

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
注:
您的代码不正确,因为
if(card_name[0]='K'| |'Q'| |'J')
被理解为
if(card_name[0]='K'| | true | true)
始终为true

检查if语句中的运算符优先级。如果你看这里,你会发现,==比| |具有更高的优先级

if (card_name[0] == 'K' || 'Q' || 'J' ){
    val = 10;
}
正确的if语句应如下所示:

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
如果不确定运算符的优先级,可以使用以下括号:

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
注: 您的代码不正确,因为
if(card_name[0]='K'| | |'Q'| |'J')
被理解为
if(card_name[0]='K'| | true | | true)

if (card_name[0] == 'K' || 'Q' || 'J' ){
    val = 10;
}
'Q'
,etc作为真值语句进行计算,由于char的值不是0,因此将始终是
真值

应该是

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
    val = 10;
}
'Q'
,etc作为真值语句进行计算,由于char的值不是0,因此将始终是
真值

应该是

if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
    val = 10;
}

不,正如许多其他人指出的那样,使用
if(card_name[0]='K'| | |'Q'| |'J')
是错误的,他们还描述了为什么以及如何纠正它。但是,如果您真的只想用一种更简短的方式编写测试,可以使用
switch
-语句:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char card_name[3];
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;

    switch (card_name[0]) {
    case 'K': /* fallthrough */
    case 'Q': /* fallthrough */
    case 'J': val = 10; break;
    case 'A': val = 11; break;
    default:  val = atoi(card_name);
    }

    printf("The card name value is %i\n", val);
    return 0;
}
#包括
#包括
int main()
{
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
交换机(卡名称[0]){
案例“K”:/*故障排除*/
案例“Q”:/*故障排除*/
案例“J”:val=10;中断;
案例“A”:val=11;中断;
默认值:val=atoi(卡片名称);
}
printf(“卡名值为%i\n”,val);
返回0;
}

请注意,
switch
语句不是C中
if
-
else if
的通用替换,因为每个
案例都需要是常量整数表达式(粗略地表达,C语言书会正确地告诉您限制)。

不,正如许多其他人所指出的,