为什么使用变量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;
}
答案 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 = TRUE
和b = TRUE
的原因。您应该只有值或那些返回值的东西。
e.g。
BOOL result = (num == 21 ? TRUE : FALSE);
BOOL a = result;
BOOL b = !result;
上的三元运算符
此外,与您的实际问题略有不同,但仍然是您应该解决的问题; Lee Daniel Crocker提出了一个很好的观点。 FALSE
不应该真正定义为1
,因为在大多数编程环境中它通常被定义为0
。 TRUE
被定义为0
以外的任何数字,即!FALSE
。因此,尝试这样做以定义您的TRUE和FALSE:
#define FALSE 0
#define TRUE !FALSE