LINUX.ORG.RU

man operator и ?: отчего с право на лево.

 


0

0

subj.

понятно что :ветка собирается с право на лево , однако это ведь ещё и порядок вычисления , но ведь в

u1()?do1t():u2()?do2t():do2f();

u1() всегда вычисляется раньше u2() , которое(u2) если вообще.

т.е порядок вычисления ?: c лева на право.

кто разъяснит?

★★☆

Ставь скобки! И хватит уже курить!

Eddy_Em ☆☆☆☆☆
()

Никогда не смотрю man operator, всегда просто расставляю скобки. Что я делаю не так?

Gvidon ★★★★
()

Ассоциативность это не порядок вычисления, а порядок разбора выражения в «логическое дерево». В cи/c++ тернарный оператор является short-circuit оператором из-за чего всегда сначала вычисляется условие и в зависимости от него одно из последующих выражений. Ну а если бы он не был «short-circuit», то порядок вычисления выражений был бы вообще не определён.

mashina ★★★★★
()
Ответ на: комментарий от mashina

в том и прикол , что ассоциативность в Сяшке увязана с порядном вычисления.

тока для тернарного оператора это приводит к забавному расхождением между вполне ожидаемым и привычным поведением и припысываннием ему ассоциативности с права.

т.е насколько я понимаю

идёт вычисление правого тернарного условного которое требует для определения какую же свою ветку выполнять вычислять тернарный что левее - в результате получается нужное поведение- вычисление слева.

qulinxao ★★☆
() автор топика
Ответ на: комментарий от mashina

судя по всем(111) мануалам ассоциативность (лево-право) и есть то что порядок эволюшен-вычислений.

qulinxao ★★☆
() автор топика
Ответ на: комментарий от qulinxao

в том и прикол , что ассоциативность в Сяшке увязана с порядном вычисления.

Ты путаешь порядок вычисления выражения с несколькими операторами (без явных скобок), типа «1 + 2 * 3» и порядок вычисления выражений внутри одного оператора. Т.е. ассоциативность и приоритеты. «+» может вычислять операнды слева-направо, но у «*» выше приоритет, поэтому левый операнд «+» будет вычислен раньше. То же самое и с "?:".

korvin_ ★★★★★
()
Ответ на: комментарий от qulinxao

right to left (C)

int main() {
  printf("%d\n",  1  ? 1 : 1 ? 2 : 1 ? 3 : 1 ? 4 : 1);
}
out: 1
left to right (PHP)
print true ? 1 : true ? 2 : true ? 3 : true ? 4 : 5;
out: 4

redgremlin ★★★★★
()
Ответ на: комментарий от qulinxao

Это означает группировку равнозначных операторов. Например, что правильная расстановка скобок в твоем примере такая:

u1() ? do1t() : ( u2() ? do2t() : do2f() );

а не

u1() ? ( do1t() : u2() ? do2t() ) : do2f();
т.к. херня получается.

И с порядком вычисления, как тебе тут уже сказали, это напрямую не связано.

korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

вот есть строка в таблице приоритетов.

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

т.е когда операции из разных строк то всё понятно

лево правосторонесть тока когда из одной строки таблицы операции.

в случае u1?d1:u2?d2:d3

что вычисления идут u1 в зависимости от результата выбор ветки .

в таблице же с право на лево.

т.е интересен пример на С где очевидно что ?: ассоциативна с права с сама собой.

qulinxao ★★☆
() автор топика

Запишись уже к логопеду, а то иногда вроде умные мысли выдаёшь, а воспринять их без тяжёлых веществ не получается.

Deleted
()
Ответ на: комментарий от qulinxao

Ты ж сам только что доказал, что не увязана. Ассоциативность выражает как строится аст, а кто и как по нему побежит редуцировать — это отдельный вопрос.

arturpub ★★
()
Ответ на: комментарий от qulinxao

A ? 1 : B ? 2 : 0. Если А, то 1, иначе если B, то 2, иначе 0.

(A ? 1 : B) ? 2 : 0. Если А, то 2, иначе если B, то 2, иначе 0.

arturpub ★★
()
Ответ на: комментарий от arturpub

Хаха, тоже попался! Второй блок выглядит так:

Можно и так, один фиг херня, только в этом случае еще и синтаксически корректная, а во многих — и с точки зрения Сишной типизации.

korvin_ ★★★★★
()
Ответ на: комментарий от qulinxao

Стандарт C++11 глава 5.16 (в станадрте C думаю также) гарантирует, что в зависимости от значения первого выражения вычислится либо второе выражение, либо третье. В твоем примере вызов u1() гарантирует такое поведение, т.е. u1()?do1t():u2()?do2t():do2f(); раскладывается на что-то вроде:

if (u1())
   do1t();
else if (u2())
   do2t();
else 
   do2f();

NegatiV
()
Последнее исправление: NegatiV (всего исправлений: 1)
Ответ на: комментарий от korvin_

Не можно и так, и не херня, а очевидный способ придать левую ассоциацию и корректная конструкция. Херню ты нарисовал, это да :) С типизацией тоже все нормально. Из юзкейсов — селектор условия, например, хотя в большинстве случаев полезна именно дефолтная правая ассоциация для chaining'а.

arturpub ★★
()
Ответ на: комментарий от NegatiV

ок.

разъясни отчего в таблице операции ?: придана ассоциативность справа на лево .

т.е приведи пример в котором фигурирует не вложенность а последовательность вот этой вот тернарной операции и на которой видно , что да - действительно ассоциативность (т.е очерёдность) с право налево . заранее спасибо.

qulinxao ★★☆
() автор топика

что :ветка

с право на лево

пробел перед запятой

u1()?do1t():u2()?do2t():do2f();

которое(u2) если вообще.

кто разъяснит?

За такое неуважение к форуму надо штрафы выписывать. Я удивлен, что нашлось более одного человека, кто это распарсил, и тем не менее потрудился ответить по теме.

Kiborg ★★★
()
Ответ на: комментарий от qulinxao

Нет, там справа налево. Иными словами, в непонятной ситуации группировка начинается справа. То есть

A ? 1 : B ? 2 : 0

означает то же самое что и

A ? 1 : (B ? 2 : 0)

А не

(A ? 1 : B) ? 2 : 0
Kiborg ★★★
()
Ответ на: комментарий от qulinxao

Вот тебе грамматика из стандара правоассоциативного тернарного оператора и лево~ оператора &&

conditional-expression := logical-OR-expression ? expression : conditional-expression
logical-AND-expression := logical-AND-expression && inclusive-OR-expression

или правоассоциативное присванивание для простоты

assignment-expression := unary-expression assignment-operator assignment-expression

Тут видно, что левоассоциативный оператор рекурсивно «наращивает» своё левое выражение и наоборот право~. Т.е. для выражений

EXPR1: A && B && C && D
EXPR2: A = B = C = D
EXPR3: A ? B : C ? D : E ? F :G

Будут построены следующие деревья операций

EXPR1:
  AND 
    AND
      AND
         A
         B
      C
    D

EXPR2:
  ASSIGN
    A
    ASSIGN
      B
      ASSIGN
        C
        D

EXPR3:
  TERN
    A
    B
    TERN
      C
      D
      TERN
        E
        F
        G     
Вот что значит ассоциативность - порядок рекурсии. При этом ассоциативность никак не определяет порядок вычисления самих выражений {A..G}. Например, для тернарного правого оператора из выражения выше вычисления нужно начинать с A углубляясь в дерево, но для право~ присваивания наоборот - с C и D поднимаясь вверх.

разъясни отчего в таблице операции ?: придана ассоциативность справа на лево .

Из практических соображений. Для правоассоциативного тернарного оператора можно записать

EXPR := COND1 ? THEN1: COND2 ? THEN2 ... CONDn ? THENn : ELSE

а для лево~ такой записи не существует без скобок. Тем не менее есть некоторые ЯП, где тернарный оператор лево~.

mashina ★★★★★
()

А я думал, что он хоть что-то знает, интересные вопросы камуфлируя имбецильностью и издевательством над языком.

Оказалось, нет, обычный клинический дегенерат.

aedeph_ ★★
()
Ответ на: комментарий от arturpub

придать левую ассоциацию и корректная конструкция. С типизацией тоже все нормально.

Корректной она будет только для bool do1t(), иначе ошибка типизации.

korvin_ ★★★★★
()

А вот в J всегда справа налево порядок.

Xenius ★★★★★
()
Ответ на: комментарий от qulinxao

На самом деле да, стало лучше. А то у меня было полное непонимания того, как же можно быть не дегенератом, но при этом настолько сильно ненавидеть людей, которые пытаются с тобой общаться. Теперь всё встало на свои места.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

с поправлением и возможным в будущем выздоровлением.

qulinxao ★★☆
() автор топика
Ответ на: комментарий от NegatiV

...

Source developed using a C++ translator may contain uses of the conditional operator that are a constraint violation if processed by a C translator. For instance, the expression x?a:b=c will need to be rewritten as x?a:(b=c)

...

ибо С != С++ :)

qulinxao ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.