TGViewer
Блог* Блог* @dereference_pointer_there · 1.98K subscribers
Post #10498 855
Блог* #prog #c #article #abnormalprogramming Серия из трёх (на текущий момент) статей о странностях C Weekend projects: getting silly with C Getting silly with C, part (void*)2 Getting silly with C, part ~(~1<<1) Наверное, мои самый любимые примеры кода из статей…
Для интересующихся, как это работает:

main, вообще говоря, в C либо не принимает аргументов, либо принимает два: argc и argv. GCC даже указывает на это при компиляции с -Wall. В данной программе main имеет некорректную сигнатуру, но в силу того, как распределяются регистры для целевого ABI, первый аргумент для int main(int, char**) и int main(int) попадают в один и тот же регистр. Иными словами, при запуске этой программы в i попадает значение argc, и так как на godbolt по умолчанию программе никаких аргументов не прокидывается, i имеет значение 1 (первым аргументом OS передаёт название программы — так, например, работает busybox, который в одном бинарнике скрывает несколько программ и по этому аргументу выбирает, какую звать).

Форматирование кода скрывает тот факт, что в программе содержатся четыре вложенных друг в друга do-while цикла (это можно проявить, если отформатировать код). Для того, чтобы циклы завершились, нужно, чтобы после выхода из циклов i было:

* кратно 2
* не равно 2
* кратно 3
* кратно 7

i начинает с 1 (точнее, 2 из-за преинкремента на первой итерации), наименьшим общим кратным 2, 3 и 7 является число 42, поэтому именно это значение принимает i и оно в итоге выходит на печать.

Так как 2 не кратно ни 3, ни 7, условие "не равно 2" избыточно. И действительно, если убрать один из do и второй while, то результат будет тот же.

Тот факт, что в i попадает именно значение argc, можно подтвердить, если добавить на gobolt окно с исполнением и докинуть аргументов командной строки для программы. Если туда вписать 41 значение, то argc будет равно 42, на первой итерации i станет равным 43 и потому программа выдаст следующее число, кратное 2, 3 и 7: The answer is 84.
  • 🤩 6
  • ❤ 1
  • 🙏 1
More from @dereference_pointer_there
  1. Oct 14, 2026r/rust (потому что написано вроде на Tauri)
  2. Oct 14, 2026advanced <...> technology such as a shopping cart
  3. Oct 14, 2026Source
  4. Oct 14, 2026#prog #rust #rustasync #article Tokio Gives Progress, Not Ordering: Scheduling 1M Tasks TL…
  5. Oct 14, 2026#game Slay the Spire 2
  6. Oct 13, 2026#prog #rust #suckassstory github.com/rust-lang/rust/issues/164250 use std::sync::Mutex; st…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →