C 中布尔值的逻辑函数错误

error in logical function with booleans in C

提问人:ramses adames 提问时间:1/19/2022 更新时间:1/19/2022 访问量:42

问:

我正在学习用 C 语言编程,我正在尝试做一个基本的功能来点燃蜡烛,它由 3 个场景组成:蜡烛被点燃,蜡烛熄灭了,我有一个打火机,蜡烛熄灭了,我没有打火机

#include <stdio.h>
#include<stdbool.h>

bool on=false;
bool lighter=false;

void candle(bool on,bool lighter){


    if(on==false && lighter=true){
        
        on=true;
        printf('The candle is out ,lit candle...');
        
    }
    else if(on==false && lighter=false){
        printf('The candle is out and I must look for a lighter');
        printf('I already have the lighter');
        lighter=true;
        printf('lit candle...');
        on=true;
    }

print('The candle is lit');
return 0;
}

问题是 VSCode 给了我一个关于 on 变量的错误,上面写着“表达式必须是可修改的左值”,我不明白它是如何工作的

C 函数 boolean-logic

评论

2赞 Jerry Jeremiah 1/19/2022
您可能不希望在这一行中出现一个: 与这一行相同:=lighter=trueif(on==false && lighter=true){lighter=falseelse if(on==false && lighter=false){
0赞 Burstful 1/19/2022
你能分享一下你的主要功能吗?将局部变量和全局变量命名为 same 是一种不好的做法。
0赞 Jerry Jeremiah 1/19/2022
此外,所有 printf 函数都有带 hsingle 引号的字符串,但它们应该是双引号。
0赞 Ken White 1/19/2022
=是分配,是比较。你在陈述中将两者混合在一起。==if
1赞 ikegami 1/19/2022
此外,明确比较 和 非常奇怪。 就足够了。truefalse!on && lighter

答:

0赞 Jerry Jeremiah 1/19/2022 #1

好吧,有几件事不对劲。

其中有几个是非常小的错别字:

  • 字符串的双引号括起来,但 printf 语句中的字符串是单引号。因此,您需要将它们全部更改为双引号。
  • 您用于打印的功能是,但您不小心使用了最后一个。因此,您需要将最后一个更改为printfprintprintf
  • 该函数不会自动在行尾放置换行符。因此,您需要在传递到的每个格式字符串的末尾使用换行符,或者改用该函数。printfprintfputs
  • void 函数不能返回值,但您已声明该函数返回 void,同时仍尝试从该函数返回零。因此,您需要从该函数中删除 或将返回类型更改为 。return 0;int

其中有几个更严重:

  • ==是平等的比较,但也是分配。您可能不想在 if 语句条件中为变量赋值。因此,您需要将 if 语句中的所有条件更改为 。====
  • C 是按值传递的,因此当您将变量传递给函数时,该函数会接收该变量的副本。如果更改函数中的参数,则更改传递给函数的变量副本,因此永远不会看到您的更改。因此,如果要反映更改,则需要使用指向原始变量的指针的函数参数,或者使用全局变量而不使用函数参数。
  • 您具有同名的全局变量和函数参数。它们不是同一个变量。如果在函数中使用变量名称,则使用的是函数参数而不是全局变量 - 全局变量永远不会更改。因此,您永远不应该拥有同名的全局变量和函数参数。

如果进行所有这些更改,则代码将编译。

如果使用全局变量而不是函数参数,则代码将如下所示:

#include <stdio.h>
#include<stdbool.h>

bool on=false;
bool lighter=false;

void candle(){

    if(on==false && lighter==true){
        
        on=true;
        printf("The candle is out ,lit candle...\n");
        
    }
    else if(on==false && lighter==false){
        printf("The candle is out and I must look for a lighter\n");
        printf("I already have the lighter\n");
        lighter=true;
        printf("lit candle...\n");
        on=true;
    }

    printf("The candle is lit\n");
}

int main(){
    candle();
    printf("Result: on=%s lighter=%s\n",
        (on?"true":"false"),
        (lighter?"true":"false")
    );
}

如果使用指向原始变量的指针的函数参数,则代码将如下所示:

#include <stdio.h>
#include<stdbool.h>

void candle(bool * on, bool * lighter){

    if(*on==false && *lighter==true){
        
        *on=true;
        printf("The candle is out ,lit candle...\n");
        
    }
    else if(*on==false && *lighter==false){
        printf("The candle is out and I must look for a lighter\n");
        printf("I already have the lighter\n");
        *lighter=true;
        printf("lit candle...\n");
        *on=true;
    }

    printf("The candle is lit\n");
}

int main(){
    bool on=false;
    bool lighter=false;
    candle(& on, & lighter);
    printf("Result: on=%s lighter=%s\n",
        (on?"true":"false"),
        (lighter?"true":"false")
    );
}