Очевидный ответ - использовать 500 звонков printfи печатать два номера каждый раз, не так ли?
Джеймс МакНеллис
433
printf («числа от 1 до 1000»);
Jondavidjohn
7
:?не условное утверждение (это выражение) ...
Крис Лутц
127
Интервью ваш шанс проявить себя. Скажите им: «Без петель или условностей? Детская игра. Я могу сделать это без компьютера!» Затем вытащите ручку и блокнот. Они могут дать вам запутанный взгляд, но просто объясните, что если вы не можете рассчитывать на встроенные языковые конструкции, вы действительно ничего не можете предположить.
JohnFx
8
Лично я думаю, что было несколько ответов, которые имели умные, интересные решения. Я также думаю, что, хотя это может быть просто ужасный вопрос для интервью, в нем может быть хорошая ценность, если интервьюер действительно ищет не столько полностью правильное решение, сколько поиск собеседника, который рассматривает подходы, которые указывают на знание TMP или использование конструкций необычными способами. Я думаю, было бы плохо, если бы этот вопрос использовался как чистый вопрос «получил-правильно-неправильно», но если бы он использовался в качестве отправной точки обсуждения, я мог бы увидеть большую ценность.
Майкл Берр
Ответы:
785
Время компиляции рекурсии! :П
#include<iostream>template<int N>structNumberGeneration{staticvoidout(std::ostream& os){NumberGeneration<N-1>::out(os);
os << N << std::endl;}};template<>structNumberGeneration<1>{staticvoidout(std::ostream& os){
os <<1<< std::endl;}};int main(){NumberGeneration<1000>::out(std::cout);}
Может кто-нибудь объяснить мне, как это работает? довольно внушительный.
Gath
28
@Zack: Давайте получим реальное, мы печатаем 1000 строк из программы, написанной, чтобы сознательно избегать циклов. Производительность не проблема.
Dreamlax
42
Для тех, кому достаточно любопытно скомпилировать это: в g ++ установите -ftemplate-deep-1000. Максимум рекурсии шаблона по умолчанию составляет 500.
Том
6
При этом все еще используются условные выражения: сопоставление с образцом прославляется, если.
Дэвид К.
10
@dreamlax: Это лишь одна из тех вещей, которые я узнал из опыта за многие годы: используйте, '\n'если вы действительно не хотите сбрасывать, используйте, ++iесли вам действительно не нужно прежнее значение i, переходите по constссылке, если у вас нет веских причин не ... Когда разработчики перестанут думать об этом (или даже никогда не начнут), они рано или поздно столкнутся с проблемой, когда это имеет значение, только они даже не знали, что есть места, где это может иметь значение.
sbi
1195
Этот на самом деле компилируется в сборку, которая не имеет каких-либо условий:
Ну, код в этом ответе, очевидно, не является ни C, ни C ++, так что это нормально, только если мы отбросим требование. Тогда любой ответ может быть квалифицирован, потому что гипотетический компилятор может просто создать требуемую программу из любого ввода.
Eq-
321
@PP, это довольно долго объяснять, но в основном, jизначально, 1потому что это на самом деле argc, то есть 1если программа вызывается без аргументов. Тогда, j/1000это 0пока jне станет 1000, после чего это 1. (exit - main)Это, конечно, разница между адресами exit()и main(). Это значит (main + (exit - main)*(j/1000)), main()пока не jстанет 1000, после чего это станет exit(). Конечным результатом является то, что main()вызывается при запуске программы, затем рекурсивно вызывает себя 999 раз при увеличении j, а затем вызывает exit(). Уфф :)
Фредерик Хамиди
7
Это одно из самых удивительных нарушений CI, которые когда-либо видели. Но будет ли это работать на всех платформах?
Qwertie
13
@Mark: это нестандартная подпись main, вы не можете вызывать main рекурсивно, и результат вычитания указателей на функции не определен.
Яков Галка
9
Да, да, это не совсем законный код C ++ по причинам, которые дает @ybungalobill, но мне нужно +1 за абсолютное безумие и тот факт, что он компилируется и работает на нескольких платформах. Бывают случаи, когда правильный ответ «Но это не стандартно!» это "Кто заботится!" :)
Люди опубликовали это. Другие версии передают номер для печати вместо использования глобального, но по сути это то же решение.
Крис Латс
1
@ Крис, они используют ту же логику, выраженную в макросах или шаблонах, увеличивая размер кода, верно? Вы могли бы также сгенерировать саму строку вывода вместо тысячи printfs.
Дариус Бэкон
О да, я вижу, ответ Кейта действительно генерирует всю строку, круто. :) Я пропустил это.
Дариус Бэкон
43
Что ж, приятное усилие, но довольно странно, что вы не разложили 8 на 2 * 2 * 2 и, таким образом, использовали уникальную первичную факторизацию
можно утверждать, что использование copy- это обман
Джон Диблинг
13
@ Йоханнес на самом деле я уверен, что printfесть петля: p
icecrime
1
@litb: заметьте, я не говорил, что «использование copy- это обман»
Джон Диблинг
2
@ Джон: копирование это обман. ты сомневаешься в этом? : P
Наваз
1
в масштабе от 1 до 10, какова вероятность того, что я использую бинарный файл?
Иордания
270
Вот три решения, которые я знаю. Второй может быть утвержден, хотя.
// compile time recursiontemplate<int N>void f1(){
f1<N-1>();
cout << N <<'\n';}template<>void f1<1>(){
cout <<1<<'\n';}// short circuiting (not a conditional statement)void f2(int N){
N &&(f2(N-1), cout << N <<'\n');}// constructors!struct A {
A(){staticint N =1;
cout << N++<<'\n';}};int main(){
f1<1000>();
f2(1000);delete[]new A[1000];// (3)
A data[1000];// (4) added by Martin York}
[ Правка: (1) и (4) могут использоваться только для констант времени компиляции, (2) и (3) могут использоваться также для выражений времени выполнения - конец редактирования. ]
Кроме того, я бы поспорил о том, что короткое замыкание не является условным ... Я бы сказал, не утверждение, а условное выражение. При условии, что мы определяем условное выражение как «что-то, что дает условные переходы в ассемблере».
Кос
5
Вопрос, который меня поразил, когда я читал конструктор первый: стандартный ли мандат, чтобы каждый элемент в массиве строился в последовательности? Было бы важно, если бы конструктор имел побочные эффекты. Я уверен, что каждый здравомыслящий компилятор реализует его как цикл 0-> 1000, но мне интересно, если бы вы все еще были совместимы и выполняли цикл в обратном направлении ...
Джозеф Гарвин
6
@Joseph - Конструктор не должен зависеть от того, в каком порядке инициируются отдельные объекты, но это хороший вопрос.
Крис Латс
12
@ Джозеф, это определяется 12.6 / 3 (C ++ 03). Инициализация производится в порядке подписки.
Йоханнес Шауб -
2
@Joseph: И они также уничтожаются в обратном порядке, так что вы можете использовать деструктор так же легко :)
мой любимый после 'printf ("числа от 1 до 1000") - глупые вопросы требуют глупых ответов.
SEngstrom
это круто. +1 за использование неясности в вопросе. хаха
Наваз
2
Под редакцией; ни в коем случае, ни в форме, ни в форме не было этого кода print "Print numbers from 1 to 1000."- неоднозначный вопрос о победе, неточные описания - отстой :)
сехе
Вау, в последнее время в ответах на этот вопрос было немного вандализма. Что-то подсказывает мне, что мы должны обновить этот замок до исторического.
вам следует вызвать fflush (stdout); после каждого printf () ... При сбое программы не гарантируется, что выходной буфер будет напечатан на экране.
Закк
10
@zakk: Это не является строго обязательным - по умолчанию stdout буферизуется строкой, поэтому его \nбудет достаточно для сброса вывода.
psmears
24
stdout - это буферизованная строка, если она может быть определена как интерактивное устройство , в противном случае она полностью буферизована. Если профессор перенаправит стандартный вывод в файл для автоматической проверки, у вас ничего не получится :-)
paxdiablo
опасность переполнения стека (например, во встроенной среде)
Высокий шанс /usr/bin/seqиспользует петлю внутри. :)
@jokester: вы имеете в виду, потому что Solaris / BSD не имеет seqутилиты (в настройках по умолчанию)? <ухмылка />
sehe
Ненавижу это говорить (ну, нет, не знаю), но в вашем решении есть ошибка. Он не распечатывает правильный набор чисел. :) Вот исправление: system("/bin/echo {1..1000}"); если бы вы сначала написали юнит-тест ...
Дон Брэнсон
1
Какой-то яркий чувак решил изменить мой ответ, так что это не моя ошибка.
Мойнудин
100
Непроверенный, но должен быть ванильный стандарт C:
Требование: «Без условий» (если, переключатель и т. д.). не "никаких условий"
jon_darkstar
32
<это не условие. Это оператор отношений. if/ elseявляется условным утверждением. ?:является условным оператором. <это просто оператор, который возвращает логическое значение. Вероятно, это отдельная машинная инструкция без прыжков или чего-либо еще.
Крис Латс
12
@ Крис Lutz: На x86, это 3 инструкции: cmpl, setleи movzbl. х86-64 это плюс а cltq. PowerPC это 2 инструкции: cmpwiа crnot.
Адам Розенфилд
4
1 - i / 1000, Нет сравнения!
Тайский
96
Немного скучно по сравнению с другими здесь, но, вероятно, то, что они ищут.
Сделано это короче. установите i = 1 вне основного, а затем внутри основного: printf ("% d \ n", 11-i) && --i && main (i);
jftuga
3
@Jens Schauder: Воспользовавшись ленивой &&оценкой в первой строке f().
Рафал Доугирд
10
Это не скучно, это просто. Если вы можете сделать то же самое с короткой функцией, как вы можете с огромным беспорядком магии шаблонов, то вы должны сделать это с помощью функции :)
amertune
21
&& является условным. Математическое И будет оценивать обе стороны (как Java и Ада «И» делает). && оценит 2-й оператор только в том случае, если (здесь он есть) первый равен true. Или другой пример: в Аде оператор коротких замыканий называется «ИЛИ ТОГДА» - используя THEN для обозначения условного аспекта. Извините, вы могли бы так же хорошо использовать? : оператор.
Мартин
Не нужно извиняться. && - оператор сравнения. Тернарный оператор является условным.
Аарон
71
Задача никогда не указывала, что программа должна завершиться после 1000.
Это не останавливается на 1000, хотя. Это просто продолжается.
Реми Лебо
Можно сократить, только если вы отмените требование C или C ++. Тогда подойдет любая «программа», потому что теоретический компилятор может сгенерировать нужную вам программу (из любого ввода).
Eq-
@eq Опять же, это компилируется и работает очень хорошо ...
Марк Макдональд
72
Как запоздалая мысль: мы можем даже избежать очевидной математики. Если мы используем rand(), мы будем печатать все их числа от 1 до 1000. В конце концов =: P
5
@pooh: Не обязательно, так как rand () имеет шанс повторения после определенной последовательности, и эта последовательность может не совпадать с решением этой проблемы
dchhetri
71
Проще простого! :П
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
Возможно, вы захотите сделать «static int current = 0», иначе выведите от 2 до 1001.
Шиннок
я изменил ++ текущий на текущий ++
Zelix
65
#include<stdio.h>#defineOut(i) printf("%d\n", i++);#define REP(N) N N N N N N N N N N
#defineOut1000(i) REP(REP(REP(Out(i))));void main(){int i =1;Out1000(i);}
Мы можем запустить 1000 потоков, каждый из которых печатает одно из чисел. Установите OpenMPI , скомпилируйте используя mpicxx -o 1000 1000.cppи запустите используя mpirun -np 1000 ./1000. Вам, вероятно, потребуется увеличить лимит дескрипторов с помощью limitили ulimit. Обратите внимание, что это будет довольно медленно, если у вас нет загруженных ядер!
Неявный цикл в библиотеке? Но +1 в любом случае для нового подхода.
Крис Латс
11
@Chris У большинства решений где-нибудь есть скрытый цикл?
Мойнудин
Я полагаю, если вы используете подход «циклы в компиляторе». Поскольку (вне возможного цикла по аргументам в MPI::Init()) я не могу представить никаких циклов в действительном двоичном файле вашей программы 1000.cpp, я дал вам +1, хотя, конечно, при его выполнении есть циклы.
Крис Латс
40
С простой C:
#include<stdio.h>/* prints number i */void print1(int i){
printf("%d\n",i);}/* prints 10 numbers starting from i */void print10(int i){
print1(i);
print1(i+1);
print1(i+2);
print1(i+3);
print1(i+4);
print1(i+5);
print1(i+6);
print1(i+7);
print1(i+8);
print1(i+9);}/* prints 100 numbers starting from i */void print100(int i){
print10(i);
print10(i+10);
print10(i+20);
print10(i+30);
print10(i+40);
print10(i+50);
print10(i+60);
print10(i+70);
print10(i+80);
print10(i+90);}/* prints 1000 numbers starting from i */void print1000(int i){
print100(i);
print100(i+100);
print100(i+200);
print100(i+300);
print100(i+400);
print100(i+500);
print100(i+600);
print100(i+700);
print100(i+800);
print100(i+900);}int main(){
print1000(1);return0;}
Конечно, вы можете реализовать ту же идею для других баз (2: print2 print4 print8 ...), но число 1000 здесь предлагает базу 10. Вы также можете немного уменьшить количество строк, добавив промежуточные функции: print2() print10() print20() print100() print200() print1000()и другие эквивалентные альтернативы.
Почему число 1000 предлагает основание 10? В любой позиционной нотации с основанием B1000 - это абсолютно правильное число и всегда равно B^3.
Филипп
Я просто имел в виду, что, учитывая, как число представлено в базе 10, факторизация «10x10x10» предложила себя, но возможны и другие альтернативы. Я думаю, что я должен был сказать «факторизация» вместо «базы»
leonbloy
34
Просто используйте std :: copy () со специальным итератором.
Я думаю, что ваш код начинается с 0. Также согласен с Крисом, вопрос, который я видел несколько лет назад, был сформулирован как «без каких-либо библиотек, кроме IO». еще +1 :)
Яков Галка
3
@Chris Lutz: реализация копии не определена. Я могу даже использовать шаблон кода, как указано выше (вы просто не знаете). Так что нельзя сказать, что он использует цикл, потому что мы не знаем.
Мартин Йорк,
7
На самом деле, мой выбор гниды не был бы неявным циклом в std::copyтакой степени, как неявный условный в operator !=(). Несмотря на это, это умный подход к обработке диапазона, и именно умные подходы - это то, что я ищу в ответах на подобные вопросы.
Майкл Берр
конкретная реализация не определена
selvaiyyamperumal
@selvaiyyamperumal: Не знаю точно, о чем вы говорите. Но если вы говорите о поведении, то стандарт с вами не согласен. «Поведение, определяемое реализацией» означает, что оно хорошо определено, но должно быть явно задокументировано реализацией. «Неопределенное поведение» означает, что все может случиться.
Мартин Йорк,
33
Использование указателя функции (ab). Никакой магии препроцессора для увеличения выхода. ANSI C.
#include<stdio.h>int i=1;void x10(void(*f)()){
f(); f(); f(); f(); f();
f(); f(); f(); f(); f();}void I(){printf("%i ", i++);}void D(){ x10( I );}void C(){ x10( D );}void M(){ x10( C );}int main(){
M();}
Это то, о чем я думал. Предыдущий человек сказал, что 5 * 5 * 5 * 8 = 1000. Я думал, что это было забавно, он упускал очевидное 10 ^ 3. Отличное решение!
Эван Моран
32
#include<iostream>#include<iterator>usingnamespace std;int num(){staticint i =1;return i++;}int main(){ generate_n(ostream_iterator<int>(cout,"\n"),1000, num);}
все в порядке, но почему "void main ()"? вредные привычки редко уходят? : P
Наваз
30
@Nawaz: потому что это тайно приложение с графическим интерфейсом Windows, так что это не имеет значения. Я только назвал это "главным", потому что я думал о лобстерах и имею ужасное правописание.
Мартин
29
Переполнение стека:
#include<stdio.h>staticvoid print_line(int i){
printf("%d\n", i);
print_line(i+1);}int main(int argc,char* argv[]){//get up near the stack limitchar tmp[8388608-32*1000-196*32];
print_line(1);}
Это для стека 8 МБ. Кажется, что каждый вызов функции занимает около 32 байтов (следовательно, 32 * 1000). Но затем, когда я запустил его, я получил только 804 (следовательно, 196 * 32; возможно, у среды выполнения C есть другие части в стеке, которые вы должны также вычесть).
В качестве примечания: я взял запрет на использование условных выражений также для логических и реляционных операторов. Если вы разрешите логическое отрицание, рекурсивный вызов может быть упрощен до:
Мне нравится, как у вас есть это с битовой сменой. но с вашим упрощением после запоминания, что делает двойной взрыв? его побитовое или логическое? я потерялся, и Google заставил меня ходить по кругуfuncs[!!(limit-1)](x+1, limit-1);
jon_darkstar
Я бы предпочел иметь один !и переключать элементы массива указателей на функции, но я не знаю, будет ли это хорошо сочетаться с вашим другим безумием.
Крис Латс
@Chris: я полностью согласен - но я не рассматривал использование операторов логики / отношения до публикации, и я подумал, что более подходящим будет однострочный патч. Кроме того, он немного лучше вписывается в запутанное ощущение проблемы.
Майкл Берр
24
Я чувствую, что этот ответ будет очень простым и легким для понимания.
int print1000(int num=1){
printf("%d\n", num);// it will check first the num is less than 1000. // If yes then call recursive function to printreturn num<1000&& print1000(++num);}int main(){
print1000();return0;}
Ваш ответ использует условные утверждения, которые запрещены в соответствии с вопросом.
stevelove
4
условные операторы, если еще и т. д. Я просто использовал логическую операцию! Хпе это понятно!
Папу
2
Даже в ваших комментариях вы написали «Если да, то вызовите рекурсивную функцию для печати». Условное, написанное неочевидным способом, все еще является условным. Значение по умолчанию num также является условным.
Джерри
23
Я пропустил все веселье, все хорошие ответы C ++ уже были опубликованы!
Это самая странная вещь, которую я могу придумать, но я бы не поспорил, что это законно C99: p
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Еще один, с небольшим изменой:
#include<stdio.h>#include<boost/preprocessor.hpp>#define ECHO_COUNT(z, n, unused) n+1#define FORMAT_STRING(z, n, unused)"%d\n"int main(){
printf(BOOST_PP_REPEAT(1000, FORMAT_STRING,~), BOOST_PP_ENUM(LOOP_CNT, ECHO_COUNT,~));}
printf
и печатать два номера каждый раз, не так ли?:?
не условное утверждение (это выражение) ...Ответы:
Время компиляции рекурсии! :П
источник
'\n'
если вы действительно не хотите сбрасывать, используйте,++i
если вам действительно не нужно прежнее значениеi
, переходите поconst
ссылке, если у вас нет веских причин не ... Когда разработчики перестанут думать об этом (или даже никогда не начнут), они рано или поздно столкнутся с проблемой, когда это имеет значение, только они даже не знали, что есть места, где это может иметь значение.Этот на самом деле компилируется в сборку, которая не имеет каких-либо условий:
Редактировать: добавлено '&', чтобы оно учитывало адрес и, следовательно, избегало ошибок указателя.
Эта версия выше в стандартном C, так как она не полагается на арифметику указателей функций:
источник
j
изначально,1
потому что это на самом делеargc
, то есть1
если программа вызывается без аргументов. Тогда,j/1000
это0
покаj
не станет1000
, после чего это1
.(exit - main)
Это, конечно, разница между адресамиexit()
иmain()
. Это значит(main + (exit - main)*(j/1000))
,main()
пока неj
станет1000
, после чего это станетexit()
. Конечным результатом является то, чтоmain()
вызывается при запуске программы, затем рекурсивно вызывает себя 999 раз при увеличенииj
, а затем вызываетexit()
. Уфф :)Я удивлен, что никто, кажется, не отправил это - я думал, что это было самым очевидным способом.
1000 = 5*5*5*8.
источник
Похоже, не нужно использовать петли
источник
copy
- это обманprintf
есть петля: pcopy
- это обман»Вот три решения, которые я знаю. Второй может быть утвержден, хотя.
[ Правка: (1) и (4) могут использоваться только для констант времени компиляции, (2) и (3) могут использоваться также для выражений времени выполнения - конец редактирования. ]
источник
Я не пишу заявление printf 1000 раз!
Пожалуйста ;)
источник
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
Он не печатает все числа, но делает «Печать чисел от 1 до 1000». Неоднозначный вопрос на победу! :)
источник
print "Print numbers from 1 to 1000."
- неоднозначный вопрос о победе, неточные описания - отстой :)Вызвать фатальную ошибку! Вот файл countup.c:
Скомпилируйте, затем выполните по приглашению оболочки:
Это действительно печатает числа от 1 до 1000, без каких-либо циклов или условий!
источник
\n
будет достаточно для сброса вывода.Использование системных команд:
источник
/usr/bin/seq
использует петлю внутри. :)seq
утилиты (в настройках по умолчанию)? <ухмылка />system("/bin/echo {1..1000}");
если бы вы сначала написали юнит-тест ...Непроверенный, но должен быть ванильный стандарт C:
источник
<
это не условие. Это оператор отношений.if
/else
является условным утверждением.?:
является условным оператором.<
это просто оператор, который возвращает логическое значение. Вероятно, это отдельная машинная инструкция без прыжков или чего-либо еще.cmpl
,setle
иmovzbl
. х86-64 это плюс аcltq
. PowerPC это 2 инструкции:cmpwi
аcrnot
.1 - i / 1000
, Нет сравнения!Немного скучно по сравнению с другими здесь, но, вероятно, то, что они ищут.
источник
&&
оценкой в первой строкеf()
.Задача никогда не указывала, что программа должна завершиться после 1000.
( Можно сократить до этого, если вы запустите ./a.out без дополнительных параметров )
источник
rand()
, мы будем печатать все их числа от 1 до 1000. В конце концов =: PПроще простого! :П
источник
источник
Мы можем запустить 1000 потоков, каждый из которых печатает одно из чисел. Установите OpenMPI , скомпилируйте используя
mpicxx -o 1000 1000.cpp
и запустите используяmpirun -np 1000 ./1000
. Вам, вероятно, потребуется увеличить лимит дескрипторов с помощьюlimit
илиulimit
. Обратите внимание, что это будет довольно медленно, если у вас нет загруженных ядер!Конечно, числа не обязательно будут напечатаны по порядку, но вопрос не требует их заказа.
источник
MPI::Init()
) я не могу представить никаких циклов в действительном двоичном файле вашей программы 1000.cpp, я дал вам +1, хотя, конечно, при его выполнении есть циклы.С простой C:
Конечно, вы можете реализовать ту же идею для других баз (2: print2 print4 print8 ...), но число 1000 здесь предлагает базу 10. Вы также можете немного уменьшить количество строк, добавив промежуточные функции:
print2() print10() print20() print100() print200() print1000()
и другие эквивалентные альтернативы.источник
B
1000 - это абсолютно правильное число и всегда равноB^3
.Просто используйте std :: copy () со специальным итератором.
источник
std::copy
такой степени, как неявный условный вoperator !=()
. Несмотря на это, это умный подход к обработке диапазона, и именно умные подходы - это то, что я ищу в ответах на подобные вопросы.Использование указателя функции (ab). Никакой магии препроцессора для увеличения выхода. ANSI C.
источник
источник
Гадкий C-ответ (развернутый только для одного стекового кадра на мощность 10):
источник
Переполнение стека:
Это для стека 8 МБ. Кажется, что каждый вызов функции занимает около 32 байтов (следовательно, 32 * 1000). Но затем, когда я запустил его, я получил только 804 (следовательно, 196 * 32; возможно, у среды выполнения C есть другие части в стеке, которые вы должны также вычесть).
источник
Забавно с указателями на функции (ни один из этих новомодных TMP не нужен):
В качестве примечания: я взял запрет на использование условных выражений также для логических и реляционных операторов. Если вы разрешите логическое отрицание, рекурсивный вызов может быть упрощен до:
источник
funcs[!!(limit-1)](x+1, limit-1);
!
и переключать элементы массива указателей на функции, но я не знаю, будет ли это хорошо сочетаться с вашим другим безумием.Я чувствую, что этот ответ будет очень простым и легким для понимания.
источник
Я пропустил все веселье, все хорошие ответы C ++ уже были опубликованы!
Это самая странная вещь, которую я могу придумать, но я бы не поспорил, что это законно C99: p
Еще один, с небольшим изменой:
Последняя идея, тот же чит:
источник
main
приводит к неопределенному поведению, насколько я помню.&&
и||
, скорее всего, подпадают под «условные», так как они закорачиваются (как бы?:
).Проще простого:
способ исполнения:
В спецификации не сказано, что последовательность должна быть сгенерирована внутри кода :)
источник
источник
источник
Больше злоупотребления препроцессором:
Я чувствую себя таким грязным; Я думаю, что я пойду в душ сейчас.
источник
A2()
без аргумента, как это?Если решения POSIX принимаются:
источник
Поскольку нет никаких ограничений на ошибки ..
Или даже лучше (?),
источник
volatile
в декларациюj