2016-08-15 2 views
0

При составлении кода ниже я получаю ошибку «именующим требуются в качестве левого операнда назначения»«именующая требуется в качестве левого операнда назначения» ошибка - тройная оператора

for (i = 1; i < 2 n; i++) { 
    for (((i<= n)?j=1:j=n-i);j<=i&&j>0;((i<=n)?j++:j--)) { 
     printf("*"); 
    } 
    printf("\n"); 
} 

На самом деле я пытался напечатать рисунок ниже, используя только два для петель

* 
** 
*** 
**** 
***** 
**** 
*** 
** 
* 

и ошибки я получаю это

pra.c:5:20: error: lvalue required as left operand of assignment for(((i<=5)?j=1:j=i);j<=i&&j>0;((i<=5)?j++:j--)){ ^
может кто-то мне помочь.

+0

Вы должны изменить '((я <= 5) = 1: J = i) 'to' (j = ((i <= 5)? 1: i)) ' –

+1

В программировании на языке C вы, к сожалению, не получаете бонусных баллов за использование каждого оператора на языке одной строки. Вместо этого напишите читаемый код. – Lundin

ответ

3

В языке C грамматика и семантика условного оператора отличаются от C++. Ваш код компилируется в C++, так как в C++ выражение

<condition> ? a = b : c = d 

будет разобрано как

<condition> ? (a = b) : (c = d) 

В C такое же выражение обрабатывается как

(<condition> ? (a = b) : c) = d 

который является совершенно иной история. Результат ?: в C никогда не является lvalue, поэтому последний разбор не компилируется.

Ваш код страдает от одной и той же ошибки.

Более педантично, как отметил Йоханнес в комментариях, ?: не может служить левой стороной оператора присваивания по причинам, не имеющим ничего общего с lvalues ​​или rvalues. Грамматика просто сразу же запрещает это. Выражение не должно восприниматься вообще. Однако, судя по сообщению об ошибке, которое вы цитировали, ваш компилятор видит проблему по-разному (или, по крайней мере, сообщает об этом так, что ее можно рассматривать как «слегка вводящий в заблуждение»).

Это один из довольно известных различий между языками C и C++:

Errors using ternary operator in c

Conditional operator differences between C and C++

+0

На момент написания этого ответа, этот ответ является единственным правильным. – Bathsheba

+0

Я всегда забываю об этом. Я думал, что левая сторона задания в C является «унарным выражением». Как он может тогда приспособиться к условному изгнанию? –

+0

У вас есть пароль? ? a = b: c = d' как выражение-присваивание в C? Я еще не вижу его, так как '? a = b: c' вовсе не является унарным выражением. Почему бы им сделать это не-lvalue выражение грамматически специально? Я думаю, что это выражение просто синтаксически ошибочно, в нем нет никакого разбора. –

Смежные вопросы