LinuxForum.Fans
Тема

как (не)написать первый быдлокод на C?

Автор: drBatty 29 сообщений 4927 просмотров
#150593
Newton написал:
( Если я неправ - доказательства в студию!)
text
|0000040b 8b45f4                         mov         eax, [ebp-0000000c]   // X1 <= x  | 10                                         
│0000040e 8b55f4                         mov         edx, [ebp-0000000c]  //  X2 <= x | 10
│00000411 4a                             dec         edx  // X2 = X2 - 1 | 9
│00000412 8955f4                         mov         [ebp-0000000c], edx  //  x <= X2 | 9
│00000415 8b55f4                         mov         edx, [ebp-0000000c]  //  X2 <= x (sic!)
│00000418 89c1                           mov         ecx, eax  // X3 <= X1 | 10
│0000041a 29d1                           sub         ecx, edx  //  X3 <= X3 - X2 | 10-9==1
│0000041c 89ca                           mov         edx, ecx  //  X2 <= X3 | 1
│0000041e 48                             dec         eax // X1 <= X1 - 1 | 9                                                                    
│0000041f 8945f4                         mov         [ebp-0000000c], eax  // x <= X1 | 9

кстати, если я не ошибаюсь, MSVC делал также.

Newton написал:
Что же касается использования в рабочем коде.. какой же ССЗБ будет такое использовать?

такое не будет. но IRL всё намного запутаннее.

#150595
Newton написал:
префикс-декремент , вычитание и возврат результата (0), пост-декремент.

ну выходит так :)

префикс-декремент, минус, возврат...
вот только постфикс-декремент выполняется от того, что было в x перед префикс-декрементом, и пишется в эту самую x, куда только что записался результат префиксного декремента.

#150600
Newton написал:
Тут и начинается неоднозначность - компилер пытается разделить её на две, при этом не забывая, что переменная все-таки одна.

он не только пытается, но и так делает. походу дела синхронизируя свои временные копии. в данном случае компилятор дважды выполняет декремент от 10, и дважды запоминает эту девятку...

#150623

Т.е., ведет себя так, будто х - это две разных переменных.
Так выходит для следующего кода:

text

    int x;
    printf("Введите число: ");
    scanf("%d", &x);

printf("\nx-- - --x = %d\n", x-- - --x); return 0;

Поведение меняется из-за появления ссылки на х. (Других причин не вижу)

Такой же коде:

text

    int i;
    printf("Введите число: ");
    scanf("%d", &i);

int x = i; printf("\nx-- - --x = %d\n", x-- - --x); return 0;

Ведет себя так, как я показал выше. И это справедливо только для gcc, MSVC как раз возвращает ноль при любом варианте.

#150678

Newton, а какое там поведение? пробовать лень :)

#150679
Newton написал:
Т.е., ведет себя так, будто х - это две разных переменных.

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

#150809

вот холивар на пустом месте развели.... си всегда славился множеством UB и спорить по ним бесполезно... всегда можно создать компилятор, который будет возвращать 192 в данном случае. и это будет соответствовать стандарту. если нечем заняться, то давайте ещё будем думать, чему равно x=333; (x++ - --x) * ((&((char) x))[1]) << (x-=7);

#150817
Fat-Zer написал:
вот холивар на пустом месте развели.... си всегда славился множеством UB и спорить по ним бесполезно... всегда можно создать компилятор, который будет возвращать 192 в данном случае.

не. в данном случае стандарт хоть и не определяет точно решение, но какие-то рамки есть.
1) тут три операции, потому мы имеем не более 6и перестановок.
2) 3 из 6 перестановок нам не подходят, ибо по стандарту -- старше - и должно вычисляться раньше.
ну и получаем мы всего 3 ответа 0,1, и 3.

Fat-Zer написал:
если нечем заняться, то давайте ещё будем думать, чему равно x=333; (x++ - --x) * ((&((char) x))[1]) << (x-=7);

уволить быдлокодера и переписать строку по человечески? не?
просто вы видите, что это быдлокод, и я вижу. А сам быдлокодер - не видит. Вот для него эта тема и создавалась - что-бы видел, какая НЁХ получается.

#150818
drBatty написал:
0,1, и 3.

s/0,1, и 3/0,1, и 2/
fixed

Войдите или зарегистрируйтесь, чтобы ответить.