ветвление при сравнении (какой код можно придумать для С?)

Модератор: Модераторы разделов

vadiml
Сообщения: 446
ОС: fc12.x86_64

ветвление при сравнении

Сообщение vadiml »

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

в Perl'e подобное можно написать (здесь не с нулем, но все равно принцип тот же -- больше, меньше или равно, главное при помощи ОДНОЙ проверки получить 3 ветки ветвления):

Код: Выделить всё

$a = 10;
$b = 20;

goto (("L1", "L2", "L3")[$a <=> $b]);

L1: print "L1: a = b\n"; goto END;
L2: print "L2: a > b\n"; goto END;
L3: print "L3: a < b\n"; goto END;

END: print "END\n";

как это написать на С ни как не придумывается
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: ветвление при сравнении

Сообщение Alxn1 »

Скорее всего никак. Или вставляя ассемблерные вставки.
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: ветвление при сравнении

Сообщение Jan2ary »

Давно не С не писал, забыл уже все...
А такой вариант? Используется в построении меню, например.

Код: Выделить всё

#include <stdio.h>

typedef int  (*func)(char*);

int choice1(char* str){
        printf("1>> %s", str);
}
int choice2(char* str){
        printf("2>> %s", str);
}
int choice3(char* str){
        printf("3>> %s", str);
}

#define CHOICES 3

func tree[CHOICES] = {choice1, choice2, choice3};

int main(int argc, char** argv){
        char* hello = "Hello, world!";

        if(argc == 1){
                return -1;
        }
        if( atoi(argv[1]) < 0 || atoi(argv[1]) >= CHOICES)
                return -2;
        tree[atoi(argv[1])] (hello);
        return 0;
}


Конечно, нет всяческих проверок типов и т.п.
Сравнение есть, но завуалированное.
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: ветвление при сравнении

Сообщение vadiml »

Jan2ary
здесь просто выбор функции по номеру из массива

в перле я использовал массив для обращения к метке из-за того, что там при значении -1 (которое можно получить из <=> или cmp ) можно получить последний элемент массива

т.е. в С можно получить 3 значения сравнив строки, но вопрос в том, как это сразу использовать и как такое сделать для чисел (в первую очередь)
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
S-Diablo
Сообщения: 4
ОС: SuSE 10.1-Mandriva 2006-WinXP

Re: ветвление при сравнении

Сообщение S-Diablo »

int a = 10;
int b = 20;
int c = (a == b ) ? 0 : ((a > b ) ? 1 : -1);

switch( c )
{
case 0:
// числа равны
break;

case 1:
// a > b
break;

case -1:
// a < b
break;
};

а вообще с помощью одной проверки получить тройное ветвление нельзя!!!
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: ветвление при сравнении

Сообщение edranovdenis »

как ни крути, в итоге ничего лучше не получиться:

Код: Выделить всё

sub a-b
jump a<0
jump a=0
jump

(сравнение на 0 лучше делать после сравнения на <0, т.к. вероятность получить =0 меньше :-)
(не знаю, но по моему, и перл и пример с-дьябло в итоге также делают...)

PS: огромнейшее спасибо Jan2ary за пример с выбором функции по номеру из массива. Было время, когда такой финт мне очень был нужен, но в книгах своих такого не нашел, и на программку одну забил до лучших времен. Пойду доделаю. :)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали: