C 中需要的 LValue

问题描述 投票:0回答:2

我得到了预期的左操作数错误,但我不知道该怎么办,因为我第一次遇到这个错误。

我写了这段代码:

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'){
      |   
c if-statement compiler-errors logical-operators
2个回答
2
投票

&&
||
和运算符的优先级高于
=
运算符,并且所有三个运算符都是从左到右关联的,所以

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')

0
投票

对于初学者来说,至少

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.");
}
© www.soinside.com 2019 - 2024. All rights reserved.