Относно троичния оператор. Пренаписвах оператор if-else в C, използвайки по-чистия троичен оператор. Ето кода:
#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|грешка: lстойност се изисква като ляв операнд на присвояване|
Това е прост код за проверка дали позицията в масива е нечетна или четна. Направих търсене и единственото нещо, което прочетох, което е свързано с този код, е, че lvalue е променлива. Ако това е вярно, ще дам пример, за който до ден днешен нямам отговор:
printf ( "%d", 23 + 4 );
Заместителят ще бъде заменен от литералната стойност 27. Тук не е включена променлива, работи трудно. Благодаря ти.
variable = condition ? true_result : false_result
. правенето на задачи вътре в блоковете с резултати е доста гадно/грозно. напр.arr[i] = i % 2 == 0 ? 0 : 1
- person Marc B   schedule 19.05.2015if
/else
. Това просто прави кода по-труден за четене (и, както видяхте, синтактично неправилен). - person Keith Thompson   schedule 19.05.2015if...else
, отколкото да декодира троичния код и поради тази причина никога не го използвам. - person Weather Vane   schedule 19.05.2015x = cond ? this : that;
избягва повтарянето наx
, особено полезно, когатоx
еfoo->bar[baz].thud
. Също така е полезно в дефиниции на макроси, когато искате макросът да се разшири до израз. - person Keith Thompson   schedule 19.05.2015if
/else
ще направи същото нещо, само че прави кода по-неясен. Използването му в израз може да бъде полезно, ако означава, че други части от същия израз не трябва да се повтарят. - person Keith Thompson   schedule 20.05.2015