LINUXTALKS.CO

Программный код без операторов ветвления.

 

L


0

1

Бывает ли программный код без операторов ветвления (совсем) может известны какие то программы.
Циклы можно, но без ветвления (if).
Вопрос конечно теоретический но мне всегда было интересно.

★★

Циклы можно, но без ветвления (if).

Гхм, циклы без ветвления (проверки условия) в студию.

cocucka
★★★★★★★★★★★★★
Последнее исправление: cocucka (всего исправлений: 1)

Linux / Firefox (NL)

Хеллоуворлд — да. Программы — нет.

MrSugoma
★★★
Linux / Firefox (US)

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

2

while (a>b) {
  a = a*b;
  break;
}

Вместо

if (a>b) {
  a = a*b;
}

И вперед.

JamesHolden
★★★★★★★★
Последнее исправление: JamesHolden (всего исправлений: 1)

Android / Firefox (BY)
Ответ на: комментарий от JamesHolden

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

int test(int a, int b){
    while (a>b) {
    a = a*b;
    break;
    }
    return a;
}

int test2(int a, int b){
    if (a>b) {
    a = a*b;
    }
    return a;
}
test(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        nop
        mov     eax, DWORD PTR [rbp-4]
        cmp     eax, DWORD PTR [rbp-8]
        jle     .L3
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-4], eax
        nop
.L3:
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
test2(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     eax, DWORD PTR [rbp-4]
        cmp     eax, DWORD PTR [rbp-8]
        jle     .L7
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-4], eax
.L7:
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
cocucka
★★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от Holger

В любом цикле есть проверка условий, что есть операция ветвления по сути.

cocucka
★★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от cocucka

Ессесно. А ещё спрашивают, зачем надо учить ассемблер.

JamesHolden
★★★★★★★★
Android / Firefox (BY)
Ответ на: комментарий от cocucka

Вот, @Holger, тут ветвление компилятор реализовал через прыжок jle на метку, а в ARM ассемблере прыжка бы не требовалось, там просто суффиксом саму операцию a*b сделали бы условно выполняющейся.

JamesHolden
★★★★★★★★
Android / Firefox (BY)

Хорошо, но допустим вариант программулины которая делает запись в системный реестр винды. Вот ей то нахрена ветвления?

Holger
★★
Linux / Chrome (DK)
Ответ на: комментарий от Holger

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

cocucka
★★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от cocucka

Так он по любому есть. И потом не будет записи нужной будет ошибка и вот и ее не надо обрабатывать.

Holger
★★
Linux / Chrome (DK)

Или программулина выводящая дату или количество прожитых дней врядли ветвления тут нужны.

Holger
★★
Linux / Chrome (DK)
Ответ на: комментарий от JamesHolden

Человек четко написал - циклы можно, if нельзя. Конец цитаты.

Это другое, это надо понимать.

MrSugoma
★★★
Linux / Firefox (US)
Ответ на: комментарий от Holger

Так тут все равно есть условие.

MrSugoma
★★★
Linux / Firefox (US)
Ответ на: комментарий от JamesHolden

Ну в одном из языков есть такой цикл повторить n раз без всяких while

Holger
★★
Linux / Chrome (DK)
Ответ на: комментарий от Holger

Ты почитай букварь какой, в самом то деле.

Повторить n раз - это цикл for, есть в любом языке, даже в нативном коде. И «повторить n раз» это УСЛОВИЕ, прикинь.

У вас что там, информатики в школе не было

JamesHolden
★★★★★★★★
Linux / Firefox (BY)
Ответ на: комментарий от JamesHolden

в том языке помнится нет for
а какого хрена надо еще лишние переменные задействовать для цикла?

Holger
★★
Linux / Chrome (DK)
Ответ на: комментарий от JamesHolden

Циклы for хороши для перебора значений массива.
А в остальном…
[code=python]
a = [9, 20, 4]
for x in a:
print (x)
[/code]

как то так

Holger
★★
Linux / Chrome (DK)

Для GPU пишут так чтоб не было ветвлений, из-за особенностей исполнения SIMT. Гуглится по словам «simt wavefront».
Ну еще при Data-oriented design.

Aber
★★★★★★★
Последнее исправление: Aber (всего исправлений: 1)

Ubuntu / Firefox (UA)
Ответ на: комментарий от JamesHolden

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

cocucka
★★★★★★★★★★★★★
iPhone / Firefox (NL)
Ответ на: комментарий от MrSugoma

Оно и заметно

cocucka
★★★★★★★★★★★★★
iPhone / Firefox (NL)
Ответ на: комментарий от Harald

Или не выходить

cocucka
★★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от Holger

Хорошо, но допустим вариант программулины которая делает запись в системный реестр винды. Вот ей то нахрена ветвления?

Догадываешься ли ты, что вызываемая для этой цели функция содержит операторы ветвления?

rezedent12
★★★★★★★
Linux / Chrome (RU)
Ответ на: комментарий от Holger

В машинном коде, если это конечно не какой то экзотический процессор, нет for, do, loop и прочей заloop. В нём есть только if и jmp.

Что бы ты не написал осмысленного (имеющего практический смысл) на языке высокого уровня, компилятор сгенерирует код с условными переходами.

rezedent12
★★★★★★★
Linux / Chrome (RU)
Ответ на: комментарий от Holger

какие такие нужны операторы ветвления если надо получить текущую дату или unixtime?

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

rezedent12
★★★★★★★
Linux / Chrome (RU)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)