我得到了预期的左操作数错误,但我不知道该怎么办,因为我第一次遇到这个错误。
我写了这段代码:
char answer1;
char answer2;
printf("Have you passed maths exam?(y - yes,n - no)");
scanf("%c", &answer1);
printf("Have you passed science exam?(y - yes,n - no");
scanf("%c", &answer2);
if (answer1 = 'y' || answer2 = 'y')
{
printf("You get the prize of 15 rupees");
} else if (answer1 = 'y' && answer2 = 'y')
{
printf("You get the prize of 45 rupees");
} else
{
printf("Sorry! But you get no prize.");
}
return 0;
错误是:
if-else.c:25:38: error: lvalue required as left operand of assignment
25 | if (answer1 = 'y' || answer2 = 'y'){
| ^
if-else.c:28:43: error: lvalue required as left operand of assignment
28 | else if (answer1 = 'y' && answer2 = 'y'){
|
&&
和||
和运算符的优先级高于=
运算符,并且所有三个运算符都是从左到右关联的,所以
answer1 = 'y' || answer2 = 'y'
相当于
answer1 = (('y' || answer2) = 'y')
和
answer1 = 'y' && answer2 = 'y'
相当于
answer1 = (('y' && answer2) = 'y')
子表达式
('y' || answer2)
和 ('y' && answer2)
不是左值,所以它们不能被赋值,但它们被用作赋值运算符的左操作数,因此编译器报告错误。
代码应该使用相等运算符
==
来测试相等性,而不是赋值运算符=
。 ==
运算符的优先级高于 &&
和 ||
so
answer1 == 'y' || answer2 == 'y'
相当于
(answer1 == 'y') || (answer2 == 'y')
和
answer1 == 'y' && answer2 == 'y'
相当于
(answer1 == 'y') && (answer2 == 'y')
对于初学者来说,至少
scanf
的第二次调用应该具有以下格式字符串
scanf( " %c", &answer2 );
^^
注意格式化字符串中的前导空格。它允许跳过空白字符。否则
scanf
的调用将读取由于在第一次调用 '\n'
时按下 Enter 键而放置在输入缓冲区中的换行符 scanf
。
至于 if 语句中的错误消息,则需要使用比较运算符
==
而不是赋值 =
.
if (answer1 == 'y' || answer2 == 'y')
^^^^ ^^^^
否则这个 if 语句看起来像
if (answer1 = ( 'y' || answer2 ) = 'y')
那是你试图给表达式
( 'y' || answer2 )
赋值。因为与逻辑运算符相比,赋值运算符的优先级较低。
但是如果要更新你的 if 语句
if (answer1 == 'y' || answer2 == 'y')
{
printf("You get the prize of 15 rupees");
} else if (answer1 == 'y' && answer2 == 'y')
//...
那么第二个 if 语句将永远无法获得控制权。您需要重写它们交换 if 语句,例如
if (answer1 == 'y' && answer2 == 'y')
{
printf("You get the prize of 45 rupees");
} else if (answer1 == 'y' || answer2 == 'y')
{
printf("You get the prize of 15 rupees");
} else
{
printf("Sorry! But you get no prize.");
}