LINUX.ORG.RU

Язык Си - никогда не поздно удивляться


1

2

Как вы думаете, какой результат напечатает программа?

#include <stdio.h>

int main()
{
  int a=0,b,c=0,d;
  b = a++ + a++ + ++a;
  d = c+ ++c + ++c;
  printf("a=%d b=%d c=%d d=%d\n", a,b, c,d);
  return 0;
}

Может быть тема и для development, но результат настолько поразил, что руки сами набрали talks.

Перемещено mono из talks

★★★

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

ЕМНИП по стандарту это undefined behavior.

в таком коде:


i = i++ + ++i;

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

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от sin_a

В принципе, этот ответ решает всё. Фишка лишь в том, что в свежих версиях компиляторов «быдлокод» давал одинаковые результаты у разных копмиляторов, а в данном случае «быдлокода» результат интереснее.

gnu: a=3 b=1 c=2 d=4

msvc: a=3 b=3 c=2 d=6

Собственно непонятки с приоритетом префиксного инкремента и операции присваивания.

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

i = i++ + ++i;

не совсем. Точнее так:

j = i++ + ++i;

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

Это же в тридцати местах разорванный баян.

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

alman ★★★
() автор топика

Это детектор плохих программистов.

Deleted
()

Может хватит уже открывать мир? Почему новички так искренне удивляются постфиксным и префиксным операциям?

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

у меня практический интерес - балуюсь синтаксическим анализатором.

лучше побалуйся чтением стандарта, например

wota ★★
()

без гугла и gcc:

a=3, b=3, c=2, d=6

тред не читал

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

gnu: a=3 b=1 c=2 d=4

Прикинул в уме по приоритету операций. Тоже насчитал 3,1,2,4. Хорошо ли это быть таким предсказуемым и мыслить шаблонно?

justAmoment ★★★★★
()

Зарой баян обратно.

thesis ★★★★★
()

Если Вас это удивляет, пора перечитать книжечки по Си. Можно еще так написать: a ^ b ^ c. Те же яйца, только в профиль.

VladTheImpaler
()

Как вы думаете, какой результат напечатает программа?

Как ты думаешь, какой ворнинг печатает «gcc -Wall», и что он этим пытается донести до своей широкой и в значительной степени быдловатой аудитории?

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

Это же в тридцати местах разорванный баян.

Ага. И тот факт, что на нём до сих пор продолжают играть, говорит о том насколько туга аудитория Си-кодеров. И косвенно характеризует качество основной массы Си-кода.

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

Почему новички так искренне удивляются постфиксным и префиксным операциям?

Потому что поведение абстрактной виртуальной машины Си идёт вразрез с их интуитивными ожиданиями.

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

Есть многое, Горацио, на свете, что и не снилось нашим мудрецам.

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

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

Даже вот так получается то же:

#include <stdio.h>

int main()
{
  int a=0,b,c=0,d;
  b = (a++) + (a++) + (++a);
  d = c+ (++c) + (++c);
  printf("a=%d b=%d c=%d d=%d\n", a,b, c,d);
  return 0;
}

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

Потому что скобки тут — как мёрвому припарки. Undefined behavior, смирись.

beastie ★★★★★
()

ты пишиш тестер компилятора?

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

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

смотри сырца того компилятора которым компиляр. листай стандарт С в части UB и точек следования

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

дык оно тут удивляется не гарантированостью порядка вычисления аргументов.

qulinxao ★★☆
()

Я только что создавал такую же тему. Потом пришёл mono и снёс мне 3 скора.

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

ты пишиш тестер компилятора?

Всё гораздо хуже. Решил как-то «запилить» «карманный» компилятор. На лексический анализатор ушло три дня, а потом из лексем стал строить дерево синтаксического разбора. Уже три месяца продолжаю его строить. На выходе из дерева синтаксического разбора будет генерироваться ассемблерный исходник.

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

Откровенно говоря, я не уверен, что не заброшу этот проект - слишком сложная задача. Большую часть разбора я уже сделал, но дьявол кроется в деталях - на всякие «мелочи» уходит очень много времени.

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

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

Примерно так и получается. В clang вложено где-то 50x6 человеколет, в gcc ещё больше.

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

quiet_readonly ★★★★
()

Чего бояним, это UB в плюсах и C

Сделано для обеспечения вольностей при оптимизации

/thread

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

Всё гораздо хуже. Решил как-то «запилить» «карманный» компилятор. На лексический анализатор ушло три дня, а потом из лексем стал строить дерево синтаксического разбора. Уже три месяца продолжаю его строить.

Почитайте про flex и bison, в также погуглите «ANSI C grammar».

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

Потому, что выглядит «запутано и сложно». Ясное дело, что в рабочий проект лучше такого не писать :))

coderage
()

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

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

нет, просто вспомнил, как когда-то давно отвечал на этот дурацкий вопрос на собеседовании. Сказал, что undefined, а четко объяснить сразу не смог, почему. У меня тогда спросили, знаю ли я, что такое точка следования, и тогда до меня дошло.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от note173

А в нормальной java это не является UB

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

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