Программирование - это просто

AlexXx

Местный
нужна календарная сетка, по любой дате тынц и появляется попап с формой для заполнения
 

AlexXx

Местный
неа, нужна календарная сетка на весь год, и как выше при нажитии на дату открывался попап с формой для заполнения, а не просто поле с датой
 

AlexXx

Местный
уже ближе, но очень навороченно и будет не понятно для клиентуры
 

Arkad

Местный
Хохмачи, а вот, скажите, кто знает фокус, как доказать на С, что 2*2 не равно 4?
Т.е. чтобы "out << 2*2;" печатало не "4", а что-нить другое. Или тоже самое через принтф.
Покажите код, кто знает.
 

CoderA

Местный

sami

Местный
Хохмачи, а вот, скажите, кто знает фокус, как доказать на С, что 2*2 не равно 4?
Т.е. чтобы "out << 2*2;" печатало не "4", а что-нить другое. Или тоже самое через принтф.
Покажите код, кто знает.
1. Не совсем понятно, чего вы все-таки хотите достичь. Что бы доказать что 2*2 не равно 4, надо доказывать что результат выражения 2*2 не равен 4. Но вы вместо такого доказательства хотите доказать что в консоль можно выводить с фокусами.

2. В языке С нет перегрузки операторов. Потому, выражение "out << 2*2" не может что-либо печатать. Единственное, что оно может - то для чего предусмотрен оператор <<, то есть сдвигать.

3. Если же вы перепутали C с C++, то в C++ стандартный поток вывода определен как cout, а не out.

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

Arkad

Местный
Во-первых предлагалось показать код на С, а не ссылку на чужую статью про перегруженный оператор. Т.е. мыслить и говорить вы можете только ссылками на вики?
Вы мне напоминаете - был у меня в колледже студент. На экзамене подходит отвечать - показывает билет, раскрывает учебник, и тычет пальцем в страницу - "Вот!". Странно, что в качестве ответа он не стал мне диктовать ссылку на вики.
И потом - откуда в С взялся перегруженный оператор?
Кстати, для этого придется определять класс "int", и в нем уже перегружать оператор "*" - как вы себе это представляете?
напишите
и синтаксический анализатор вас сразу завернет
 
Последнее редактирование:

CoderA

Местный
Во-первых предлагалось показать код на С, а не ссылку на чужую статью про перегруженный оператор. Т.е. мыслить и говорить вы можете только ссылками на вики?
Вы мне напоминаете - был у меня в колледже студент. На экзамене подходит отвечать - показывает билет, раскрывает учебник, и тычет пальцем в страницу - "Вот!". Странно, что в качестве ответа он не стал мне диктовать ссылку на вики.
И потом - откуда в С взялся перегруженный оператор?
Кстати, для этого придется определять класс "int", и в нем уже перегружать оператор "*" - как вы себе это представляете?
напишитеи синтаксический анализатор вас сразу завернет

1) Все лучшее сказано до нас.
2) Каков вопрос, таков ответ.
:)
 

Arkad

Местный
1. Не совсем понятно, чего вы все-таки хотите достичь. Что бы доказать что 2*2 не равно 4, надо доказывать что результат выражения 2*2 не равен 4. Но вы вместо такого доказательства хотите доказать что в консоль можно выводить с фокусами.
В общем-то я хотел только поделиться фокусом, основанным на распространенной ошибке компиляторов С. Фокус демонстрирует не изощренность ума фокусника, а возможную особенность избранного компилятора, которую следует учитывать в своих опусах.
Кстати, способ вывода здесь не играет никакой роли. Именно результат выражения 2*2 не равен 4, в чем можно убедится хоть в отладчике ничего никуда не выводя. Просто присвоив 2*2 переменной, и посмотрев ее значение после присвоения.
 

sami

Местный
В общем-то я хотел только поделиться фокусом, основанным на распространенной ошибке компиляторов С. Фокус демонстрирует не изощренность ума фокусника, а возможную особенность избранного компилятора, которую следует учитывать в своих опусах.
Кстати, способ вывода здесь не играет никакой роли. Именно результат выражения 2*2 не равен 4, в чем можно убедится хоть в отладчике ничего никуда не выводя. Просто присвоив 2*2 переменной, и посмотрев ее значение после присвоения.
Мне кажется что вы хотели не поделиться, а выяснить, кто знаком с этим фокусом.
Да, можете не стесняться и открыть багтрэкер любого продукта (зачем ограничиваться компиляторами?) и начать выяснять, есть ли на форуме люди, знакомые с какими-нибудь из багов. Полагаю, вам понравится. Заодно поднимите самооценку.
 
  • Like
Реакции: maxx

Arkad

Местный
Мне кажется что вы хотели не поделиться, а выяснить, кто знаком с этим фокусом.
Да, можете не стесняться и открыть багтрэкер любого продукта (зачем ограничиваться компиляторами?) и начать выяснять, есть ли на форуме люди, знакомые с какими-нибудь из багов. Полагаю, вам понравится. Заодно поднимите самооценку.
Я, в общем-то, надеялся, что еще кто-то знает этот фокус и поделится своим опытом на каких компиляторах он проходит (т.е. где нельзя так делать).
Хорош затягивать интригу. Вот оно:
Код:
int val=2;
*val=3;
cout << 2*2;
Некоторые недоразвитые компиляторы первым оператором эквивалентят переменную и константу, в результате чего после второго оператора константа "2" принимает значение "3".
Сей нелепостью грешат все компиляторы С (не С++!) от Мелкософта.
Компиляторы от DEC из нутра УНИХа не все, но тоже случается. Т.е. надо проверять.
 

sami

Местный
Некоторые недоразвитые компиляторы первым оператором эквивалентят переменную и константу, в результате чего после второго оператора константа "2" принимает значение "3".
Сей нелепостью грешат все компиляторы С (не С++!) от Мелкософта.
Компиляторы от DEC из нутра УНИХа не все, но тоже случается. Т.е. надо проверять.
Ох и актуальный же вы фокус вспомнили.
Я не знаю ни одного компилятора C (не C++!) от Мелкософта, которому бы не исполнилось больше 20и лет.
Кроме этого, проблема не в компиляторе. Проблема в программе. Расписывание не вами выделенной памяти ведет к UB. А ожидать какого-то определенного (пусть и адекватного) поведения программы после намеренно спровоцированного UB может только фокусник.

Надо проверять - проверяйте. Можете проверить еще какие из ЖК матриц не глючат после выпрямления на них гвоздей.
 

notacat

Местный
может я чего не понимаю, но в первом операторе никакой константы нет, а во втором операторе - меняется значение переменной по ссылке, а вовсе не константа. Что напишешь - то пожнешь.
Для того, чтоб константа была, вроде нужно const использовать

А что, правда есть такие компиляторы, в которых после первых двух строчек, цифра 2 становится по всему коду цифрой 3?
 

Arkad

Местный
может я чего не понимаю, но в первом операторе никакой константы нет, а во втором операторе - меняется значение переменной по ссылке, а вовсе не константа. Что напишешь - то пожнешь.
Для того, чтоб константа была, вроде нужно const использовать

А что, правда есть такие компиляторы, в которых после первых двух строчек, цифра 2 становится по всему коду цифрой 3?
Константа здесь ни при чем. И никому она тут не нужна.
Во втором операторе - меняется значение переменной по ссылке. - Это так должно быть по описанию языка.
Дело в том, что компилятор все встреченные по ходу константы автоматически обращает во внутренние const с каким-то выдуманным именем. Т.е. первый оператор у компилятора распадается на группу:
Код:
int c2; //вместилище двойки
c2=2;
int val;
val=c2;
int *pc2=&c2 //указатель на двойку для дальнейшего использования константы 2
int *pval=&val /указатель на переменную на будущее
pval=pc2; /лишнее действие компилятора - эквивалентит ссылку на константу и ссылку на переменную val.
компилятор это все делает, ессно, не на С, а на промежуточном ассемблере.
На С я только показал его внутренние выкрутасы.
Далее везде, где в исходном тексте встречается переменная val будет использована ссылка на нее в pval.
Вот и получается, что
*val=3; будет выполнено как *pval=3; - с2 стало равно "3".
Ну, и далее в том же духе:
оператор вывода (последний) превратится в cout << (*pc2)*(*pc2) и напечатает "9".
И никаких UB. Просто не надо эквивалентитить служебную ссылку на переменную со служебной ссылкой на константу.
 
Сверху