LINUX.ORG.RU

первое
  if (t1)
     {
        t2 = 1;
     }
   else
     {
        t2 = 2;
     }
                                                                                
второе
  t2 =  t1 ? 1 : 2;
                                                                                
первое и второе делают одно и то же

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

именно это оно и делает.это называется "оператор ?" - единственный в С (если не ошибаюсь) тройственный оператор. Он сводится к следуесчему: (условие)?{делать если да}:{делать если нет}. Хотя еффект обоих вариантов одинаков, говорят что с "оператором ?" компайлер генерирует более компактный код. А в принципе стоит тебе книжки прочитать.

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

> Хотя еффект обоих вариантов одинаков, говорят что с "оператором ?" компайлер генерирует более компактный код

ttt $> cat t1.c
int main ()
{
   int t1 = 1, t2;
   t2 = t1 ? 1 : 2;
   return 0;
}
ttt $> cat t2.c
int main ()
{
   int t1 = 1, t2;
   if (t1)
     t2 = 1;
   else
     t2 = 2;
   return 0;
}
ttt $> gcc -S t1.c
ttt $> gcc -S t2.c
ttt $> ll t*
-rw-r--r--    1 ananas   users          68 Янв 30 16:55 t1.c
-rw-r--r--    1 ananas   users         450 Янв 30 17:00 t1.s
-rw-r--r--    1 ananas   users          93 Янв 30 16:59 t2.c
-rw-r--r--    1 ananas   users         404 Янв 30 17:00 t2.s
-rw-r--r--    1 ananas   users         236 Янв 28 14:31 testcat
-rw-r--r--    1 ananas   users    55541760 Янв 28 19:54 ttt.iso
ttt $>

судя по этому - наоборот. с ? ассемблерный листинг больше

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

при дефолтной. 

ttt $> diff t1.s t2.s
--- t1.s        Fri Jan 30 17:00:51 2004
+++ t2.s        Fri Jan 30 17:00:54 2004
@@ -1,24 +1,22 @@
-       .file   "t1.c"
+       .file   "t2.c"
        .text
 .globl main
        .type   main, @function
 main:
        pushl   %ebp
        movl    %esp, %ebp
-       subl    $24, %esp
+       subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp
        movl    $1, -4(%ebp)
        cmpl    $0, -4(%ebp)
        je      .L2
-       movl    $1, -12(%ebp)
+       movl    $1, -8(%ebp)
        jmp     .L3
 .L2:
-       movl    $2, -12(%ebp)
+       movl    $2, -8(%ebp)
 .L3:
-       movl    -12(%ebp), %eax
-       movl    %eax, -8(%ebp)
        movl    $0, %eax
        leave
        ret
ttt $>

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

в добавление к флейму ;))

ttt $> gcc --version
gcc (GCC) 3.3.2 20031022 (Red Hat Linux 3.3.2-1)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ttt $>

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

так при дефолте он не оптимизирует

Если у оптимизирующего компилятора есть на эти два случая разница то он кривой имхо

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

2ananas:
Ну ты дал, читаем мануал:
-O0 Do not optimize. This is the default.

После оптимизатора ясен пень что if что ?: все едино.
Если в каком-то компиляторе это не так - в сад этот компилятор.

anonymous
()
Ответ на: комментарий от ananas

PS: забыл добавить - твой пример вообще нет смысла компилить потому что компилятор после оптимизации вообще никакого кода не сгенерит так как видит что результаты вычислений не используются.

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

да, будет просто push ebp, mov ebp, esp, leave и ret.

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