布尔发生了奇怪的事情?

时间:2017-09-27 00:13:21

标签: c

为什么使用变量a我需要使用符号=,但使用变量b GCC告诉我使用==?它们是否应该与=一起使用,我错了还是什么?如果我使用普通if,这件事情就不会发生。

P.S:我知道<stdbool.h>

谢谢大家。

#define FALSE 0
#define TRUE  1

typedef int BOOL;

int main()
{
    BOOL a;
    BOOL b;

    int num = 21; // random number

    (num == 21) ? a = TRUE : b = TRUE;

    return 0;
}

5 个答案:

答案 0 :(得分:1)

起初这很棘手。但是GCC抱怨的原因很简单。

(num == 21) ? a = TRUE : b = TRUE;

这里,冒号运算符优先于等于运算符。如此有效,此声明被评估为

((num == 21) ? a = TRUE : b) = TRUE;

又与

相同

TRUE = TRUE;

所以编译器正确地抱怨左值作为赋值的左操作数。但是,如果使用括号来更正亲和力,则不会抱怨。

(num == 21) ? (a = TRUE) : (b = TRUE); //没有编译错误

答案 1 :(得分:0)

相当于

((num == 21) ? a = TRUE : b) = TRUE;

因此,您要分配表达式的结果,而不是赋值给变量。因此编译器需要==运算符。

使用

(num == 21) ? a = TRUE : (b = TRUE);

答案 2 :(得分:0)

以下是使用stdbool.h库的更好代码。 =&amp; ==是不方便的!第一个用于比赛,第二个用于比较

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

int main(void){

bool a = false;
bool b = false;

int num = 21; // random nr lol

bool result = (num == 21) ? true : false;
a = result;
b = !result;
return 0;
}

答案 3 :(得分:0)

如果您尝试这样做:

(num == 21) ? a = TRUE : b = TRUE;

由于运算符优先级,语法无效。三元运算符?:的优先级高于赋值运算符=。所以上面的表达式与:

相同
((num == 21) ? a = TRUE : b) = TRUE;

这是无效的语法,因为你不能在作业的左侧有这样的表达式。

您需要添加括号以获得所需的行为。

(num == 21) ? a = TRUE : (b = TRUE);

答案 4 :(得分:-2)

这种语法称为三元运算符。它们通常用于执行简单表达式,或者根据条件将事物分配给ONE变量,而不是使用两个变量处理赋值逻辑。

这就是为什么在三元运算符中不能同时包含a = TRUEb = TRUE的原因。您应该只有值或那些返回值的东西。

e.g。

BOOL result = (num == 21 ? TRUE : FALSE);
BOOL a = result;
BOOL b = !result;

详细了解Mozilla's documentation

上的三元运算符

此外,与您的实际问题略有不同,但仍然是您应该解决的问题; Lee Daniel Crocker提出了一个很好的观点。 FALSE不应该真正定义为1,因为在大多数编程环境中它通常被定义为0TRUE被定义为0以外的任何数字,即!FALSE。因此,尝试这样做以定义您的TRUE和FALSE:

#define FALSE 0
#define TRUE !FALSE