Я новичок в языке Си. У меня есть сомнения относительно ошибки lvalue. Как я понимаю, мы получаем ошибку lvalue, когда нет переменной с постоянным адресом для хранения значения R. Здесь я вижу переменную на левой стороне. Но все равно я получаю ошибку lvalue. Может кто-нибудь, пожалуйста, проясните мои понятия о lvalue или используемом операторе.

#include"stdio.h"
void main()
{
int x=10,a;
x<0 ? a = 100 : a = 1000;
printf(" %d",a);
}

Благодарю вас.

c
2
Yash Joshi 4 Мар 2018 в 10:30

5 ответов

Лучший ответ

Это было бы

a = x < 0 ? 100 : 1000;

Присвоение имеет более низкий приоритет, чем троичный оператор, поэтому оно ошибается.

Или это также будет работать (учитывая то, что я сказал ранее)

x<0 ? (a = 100) : (a = 1000);

Как ваш компилятор видел?

((x<0) ? a = 100 : a) = 1000;

Теперь понятно, почему компилятор жаловался на lvalue (троичный оператор сгенерировал rvalue, а оператор присваивания ожидает lvalue слева от него) Не так ли?

7
user2736738 4 Мар 2018 в 07:49

Вы не присваиваете результат операции переменной для ее хранения. Вы объявили int a, но никогда не использовали его.

a = x < 0 ? 100 : 1000;

Также, как примечание, присвоение = имеет более низкий приоритет, чем троичный оператор, поэтому предупреждение сгенерировано из-за него.

0
Volkan Güven 4 Мар 2018 в 15:14

Lvalue (значение локатора) представляет объект, который занимает некоторое идентифицируемое место в памяти (то есть имеет адрес).

Давайте возьмем пример

int var;
var = 4;

Присвоение ожидает lvalue в качестве своего левого операнда , а var является lvalue, поскольку это объект с идентифицируемой ячейкой памяти. С другой стороны, следующие недействительны:

4 = var;       // ERROR!
(var + 1) = 4; // ERROR!

Ни константа 4, ни выражение var + 1 не являются l-значениями (что делает их r-значениями). Они не являются lvalues, потому что оба являются временными результатами выражений, которые не имеют идентифицируемой области памяти (то есть они могут просто находиться в каком-то временном регистре на время вычисления). Поэтому присваивать им нет смысла в семантике - присваивать некуда.

0
yajiv 4 Мар 2018 в 07:47
#include"stdio.h"
void main() {
   int x=10,a;
   a = x<0 ? 100 : 1000;
   printf(" %d",a);
}

Тернарный оператор используется по-разному.

Х = (условие)? val1: val2;

  1. Здесь условие может быть чем угодно.

  2. Тип val1 и val2 должны быть одинаковыми.

0
sonus21 4 Мар 2018 в 07:33

Вы можете назначить значение следующим образом.

a = x<0 ? 100 : 1000;
0
Saqib Farooq 4 Мар 2018 в 07:45