диапазон значений в отрицательном и положительном диапазоне до 0 при троичных операциях? - PullRequest
0 голосов
/ 13 марта 2012

У меня есть проблема, которую я хотел бы решить. Это выражение работает до тех пор, пока x положителен

x > 0 ? x - y : x + y;

Однако, когда она становится отрицательной, здесь начинается проблема. Итак, я подумал о

x !=0 & x < 0 ? x - y : Math.abs(x - y)*-1) 

но это никуда меня не привело, и я решил это:

if (x > 0 && x - y > 0) {
    x -= y;
} else if (x < 0 && x + y > 0) {
    x += y;
} else {
    x = 0;
}

однако это долго и выглядит не элегантно. любой способ сделать это короче и эффективнее с тройными операциями?

Ответы [ 5 ]

2 голосов
/ 13 марта 2012
x = x >=0 ? x - y : x + y;
x = x < 0 ? 0 : x;

или

x = Math.max(x >= 0 ? x - y : x + y, 0);
1 голос
/ 13 марта 2012

попробуйте

x = !x? 0 : Math.max(0, x-y*(Math.abs(x)/x));
0 голосов
/ 13 марта 2012

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

Я думаю, что код, который вы написали с помощью операторов if / else, безусловно, является лучшим решением.Я программирую более 40 лет, и, поверьте мне, вы всегда должны отдавать предпочтение написанию кода, который легко понять, по сравнению с кодом, который якобы «элегантен».Это сэкономит вам много времени, особенно когда вы вернетесь к коду после долгого периода времени и забудете, что пытались сделать.

0 голосов
/ 13 марта 2012

Понятия не имею, почему вы пытаетесь делать то, что делаете, но вы не можете просто сделать:

Math.max(x < 0 && x + y > 0 ? x + y : x - y, 0)

, который, кажется, делает то же самое, что и ваше заявление if.

0 голосов
/ 13 марта 2012

Да, вы можете написать то же самое, используя условный (или троичный) оператор:

x =
  x > 0 && x - y > 0 ? x - y :
  x < 0 && x + y > 0 ? x + y :
  0;

Или отделите проверку нуля:

x =
  x > 0 ? x - y :
  x < 0 ? x + y :
  0;
x = x > 0 ? x : 0;
...