2015-05-19 4 views
3

О тройном операторе. Я переписывал оператор if-else в C, используя более чистый тернарный оператор. Here's код:i% 2 == 0? arr [i] = 0: arr [i] = 1; Ошибка тройного оператора

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int arr[10]; 
    int i; 

// for (i = 0; i < 10; i++) 
// { 
//  if (i % 2 == 0) 
//  { 
//   arr[i] = 0; 
//  } 
// 
//  else arr[i] = 1; 
// } 

    for (i = 0; i < 10; i++) 
    { 
     i % 2 == 0 ? arr[i] = 0 : arr[i] = 1;//Line in question 
    } 

    /* Just to check the result */ 
    for (i = 0; i < 10; i++) 
    { 
     printf ("%d ", arr[i]); 
    } 

    return 0; 
} 

Закомментированный код сделал работу, но на мое удивление, когда я скомпилированный файл с тройным оператором, я получил следующее:

C:\Users...\main.c|21|error: lvalue required as left operand of assignment|

Это простой код для проверки погоды, положение в массиве нечетное или четное. Был ли поиск и единственное, что я прочитал, связанное с этим кодом, состоит в том, что lvalue является переменной. Если это правда, я собираюсь передать пример, который я до сих пор не получил ответ на:

printf ("%d", 23 + 4); 

Заполнитель собирается заменить буквальным значением 27. Нет переменная не участвует здесь он работает жестко. Спасибо.

+0

тройных должна быть 'переменным = условие? true_result: false_result'. выполнение заданий внутри блоков результатов довольно неприятно/уродливо. например 'arr [i] = i% 2 == 0? 0: 1' –

+5

Тернарный оператор не «более чист», чем if-else. Ваша удивительная ошибка - это демонстрация этого факта. – Hurkyl

+2

По крайней мере, в этом случае тернарный оператор не является «более чистым», чем оператор 'if' /' else'. Это просто делает код сложнее читать (и, как вы видели, синтаксически неверно). –

ответ

8

Изменение:

i % 2 == 0 ? arr[i] = 0 : arr[i] = 1; 

к этому:

i % 2 == 0 ? (arr[i] = 0) : (arr[i] = 1); 

Условный оператор имеет более высокий приоритет, чем оператор присваивания.

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

arr[i] = (i % 2 == 0 ? 0 : 1); 

или просто:

arr[i] = i % 2; 
+0

Или, 'arr [i] = ' может быть понятнее. – juanchopanza

+8

Или 'arr [i] = i% 2;' –

+1

@KeithThompson Да, это определенно выигрывает. – juanchopanza

4

Вы можете просто его :)

arr[i] = i%2; 
+2

Или еще лучше 'i & 1' правильно обрабатывать отрицательные значения, что, по общему признанию, не является проблемой в исходном образце кода. – doynax

1

Due к проблемам приоритетов операторов, я считаю, что ваш код обрабатывается следующим образом: (i % 2 == 0 ? arr[i] = 0 : arr[i]) = 1;. Тернарный оператор производит rvalue, который не может быть назначен на C. Вы должны изменить его i % 2 == 0 ? (arr[i] = 0) : (arr[i] = 1);

Во всяком случае, вся эта конструкция является superfluos, и должны быть лучше заменить чем-то вроде arr[i] = i % 2;

+0

@MattMcNabb: thanks, mispelled =) Я имел в виду 'rvalue' – Mints97

0

Почему нет:

for (i=0; i < 10; i+=2) { 
    arr[i] = 0; 
    arr[i+1] = 1; 
} 
+0

Задача состояла в том, чтобы сделать все это в одной строке – mxajd

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

  • Нет связанных вопросов^_^