Re[4]: Накидайте плиз задачек на знание языка Си++
От: alpha21264 СССР  
Дата: 04.04.25 12:02
Оценка: :)
Здравствуйте, sergii.p, Вы писали:

SP>Здравствуйте, alpha21264, Вы писали:


A>>Ну с первой задачей я справлюсь.

A>>А про шаблоны честно скажу, что не умею.
A>>Откажете?

SP>я вообще никогда не отказываю. Я говорю уровень кандидата. А уже руководство принимает решение: соответствует ли уровень запросам. Но вообще если senior говорит, что в шаблоны не умеет, то большой вопрос почему он считает себя сеньёром.


Наверное, потому что компьютер, с которого ты написал своё сообщение, сделан с помощью моей программы...
И шаблоны для этого не понадобились, потому что шаблоны — зло.

Вот представь себе, что программы живут долго, в некоторых из них встречаются строчки типа #ifdef VAX_VMS,
и вдруг там встречается кусок кода, с навороченными шаблонами, и никто (включая автора) не знает, как это работает.

Течёт вода Кубань-реки куда велят большевики.
Re[7]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 04.04.25 12:09
Оценка: +2 :))
Здравствуйте, alpha21264, Вы писали:

A>На самом деле надо так:


A>
A>#define SUM(a,b) (a)+(b)
A>


Ух ты! И что выведет эта программа?

#include <iostream>

#define SUM(a,b) (a)+(b)

int main() {
    std::cout << SUM(1, 1) * 10 << std::endl;
}


--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 04.04.2025 12:10 rg45 . Предыдущая версия .
Re[7]: Накидайте плиз задачек на знание языка Си++
От: T4r4sB Россия  
Дата: 04.04.25 12:11
Оценка: +1 -1 :)
Здравствуйте, alpha21264, Вы писали:

A>На самом деле надо так:


A>
A>#define SUM(a,b) (a)+(b)
A>


А что тогда выведет такая программа?

std::cout << SUM(2, 2) * 2 << std::endl;
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 04.04.2025 12:12 T4r4sB . Предыдущая версия .
Re[7]: Накидайте плиз задачек на знание языка Си++
От: kov_serg Россия  
Дата: 04.04.25 12:27
Оценка: :)
Здравствуйте, alpha21264, Вы писали:

A>На самом деле надо так:

Внесём еще правок
#define SUM(V,Y) ((V)+(Y))

И да для SUM(i++,i++) будут сайд эффекты.
Так же как и для
int mean3(int a,int b,int c) { return (a+b+c)/3; }
Но это же c++ тут надо знать где грабли разложены. Потому как они почти всюду
Отредактировано 04.04.2025 12:27 kov_serg . Предыдущая версия .
Re[8]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 04.04.25 12:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

A>>На самом деле надо так:

_>Внесём еще правок
_>
_>#define SUM(V,Y) ((V)+(Y))
_>

_>И да для SUM(i++,i++) будут сайд эффекты.
_>Так же как и для
_>
_>int mean3(int a,int b,int c) { return (a+b+c)/3; }
_>


_>Но это же c++...


Ага. Восьмидесятый уровень
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 04.04.2025 13:27 rg45 . Предыдущая версия .
Re[8]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 04.04.25 13:06
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Внесём еще правок

_>
_>#define SUM(V,Y) ((V)+(Y))
_>

_>И да для SUM(i++,i++) будут сайд эффекты.

Будет UB. В старых терминах — множественная модификация переменной между двумя точками следования. Сейчас термины уже другие (sequenced before, sequenced after, etc.), но UB никуда не делось.

А сайд эффекты, это когда:

#define MIN(V,Y) ((V)<(Y) ? (V) : (Y))
// . . .
MIN(++a, ++b)
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 04.04.2025 13:15 rg45 . Предыдущая версия . Еще …
Отредактировано 04.04.2025 13:14 rg45 . Предыдущая версия .
Отредактировано 04.04.2025 13:12 rg45 . Предыдущая версия .
Re[8]: Накидайте плиз задачек на знание языка Си++
От: alpha21264 СССР  
Дата: 04.04.25 13:35
Оценка: :)
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, alpha21264, Вы писали:


A>>На самом деле надо так:


A>>
A>>#define SUM(a,b) (a)+(b)
A>>


TB>А что тогда выведет такая программа?


TB>
TB>std::cout << SUM(2, 2) * 2 << std::endl;
TB>


Да, нехорошо-с. Тогда вот так:

#define SUM(a,b) ((a)+(b))

Течёт вода Кубань-реки куда велят большевики.
Re[9]: Накидайте плиз задачек на знание языка Си++
От: kov_serg Россия  
Дата: 04.04.25 17:07
Оценка:
Здравствуйте, rg45, Вы писали:

_>>Но это же c++...

R>Ага. Восьмидесятый уровень

compatibility mode
Re[5]: Накидайте плиз задачек на знание языка Си++
От: CEMb  
Дата: 07.04.25 11:01
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>компьютер, с которого ты написал своё сообщение,

A>сделан с помощью моей программы...

Что?...
Re[8]: Накидайте плиз задачек на знание языка Си++
От: CEMb  
Дата: 07.04.25 11:10
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>И да для SUM(i++,i++) будут сайд эффекты.

_>Так же как и для
_>
_>int mean3(int a,int b,int c) { return (a+b+c)/3; }
_>
Но это же c++ тут надо знать где грабли разложены. Потому как они почти всюду


Надо избегать грабли, если есть подозрение на грабли, плюс подозрение на грабли в будущих редакциях.
Re[7]: Накидайте плиз задачек на знание языка Си++
От: CEMb  
Дата: 07.04.25 11:12
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Когда выяснится, что у вас все "амбициозно растут" вместо того чтобы работать.

A>На самом деле надо так:

A>
A>#define SUM(a,b) (a)+(b)
A>


Никто выше не спросил про SUM("a", "b");
Re[3]: Накидайте плиз задачек на знание языка Си++
От: B0FEE664  
Дата: 07.04.25 11:34
Оценка:
Здравствуйте, rg45, Вы писали:

  Скрытый текст
SP>>Ещё бывает по шаблонам спрашиваю. Прошу написать функцию sum, которая суммирует различные типы

SP>>
SP>>sum(std::string{""}, "abc");
SP>>sum(0, 1.0);
SP>>


R>http://coliru.stacked-crooked.com/a/c4b88d70e5067c24

R>
R>#include <iostream>

R>template <typename T, typename...X>
R>decltype(auto) sum(T&& t, X&&...x)
R>requires requires {(std::forward<T>(t) + ... + std::forward<X>(x));}
R>{
R>    return (std::forward<T>(t) + ... + std::forward<X>(x));
R>}

R>int main() {
R>    std::cout << sum("Hello", std::string(", World"), '!') << std::endl;
R>}
R>

R>Так норм?
ага

R>Это, скажем так, параноидальный уровень обобщенности. Этот вариант учитывает, что operator+ может быть перегружен пользователем и иметь побочные эффекты и самую безумную семантику. Например, модифицировать операнды.

Параноидальный, да, но от дурака не спасает:
  std::cout << sum("1234567890", 'a') << std::endl;

И каждый день — без права на ошибку...
Re[4]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 07.04.25 11:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Параноидальный, да, но от дурака не спасает:

BFE>
BFE>  std::cout << sum("1234567890", 'a') << std::endl;
BFE>

BFE>

Блин, не сразу понял суть проблемы. Ну да, от дураков не спастись.

Ну, с другой стороны, дурак с тем же успехом может написать: "1234567890" + 'a'. Так что, вряд ли корень зла находится в функции sum.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 07.04.2025 12:28 rg45 . Предыдущая версия . Еще …
Отредактировано 07.04.2025 12:01 rg45 . Предыдущая версия .
Re: Накидайте плиз задачек на знание языка Си++
От: The Passenger СССР  
Дата: 09.04.25 05:27
Оценка:
Здравствуйте, C0x, Вы писали:

спроси дипсика
Re: Накидайте плиз задачек на знание языка Си++
От: B0FEE664  
Дата: 10.04.25 17:21
Оценка: +1 -1 :)
Здравствуйте, C0x, Вы писали:

C0x>Если у вас есть какие-нибудь подобного рода перлы, то буду очень благодарен.

//Problem 2: what is wrong here? Plz fix.

enum class Mode{ way, no_way };

inline Mode GetMode()
{
  return Mode::no_way;
}


struct X
{
      static bool AmIM()
      {
#ifdef M_D_C
          bool res = true;
#else
          bool res = false;
#endif
          return res;
      }

      static bool isM_D_C_And_Way()
      {
          return (AmIM && GetMode() == Mode::way);
      }
};
И каждый день — без права на ошибку...
Re[2]: Накидайте плиз задачек на знание языка Си++
От: sergii.p  
Дата: 11.04.25 05:13
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, C0x, Вы писали:


C0x>>Если у вас есть какие-нибудь подобного рода перлы, то буду очень благодарен.

BFE>
BFE>      static bool isM_D_C_And_Way()
BFE>      {
BFE>          return (AmIM && GetMode() == Mode::way);
BFE>      }
BFE>};
BFE>


только то, что после AmIM забыли скобочки?
Re[3]: Накидайте плиз задачек на знание языка Си++
От: B0FEE664  
Дата: 11.04.25 08:05
Оценка: -1 :)
Здравствуйте, sergii.p, Вы писали:

SP>только то, что после AmIM забыли скобочки?


Да. Как и "Problem 1".
Ничего интересного, кроме того, что подобный код прошёл код-ревью, компилируется, выполняется и не содержит UB.
И каждый день — без права на ошибку...
Re[4]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 11.04.25 08:09
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Да. Как и "Problem 1".

BFE>Ничего интересного, кроме того, что подобный код прошёл код-ревью, компилируется, выполняется и не содержит UB.

Я больше скажу, если даже исправить эту ошибку, то ничего в том примере не изменится. isM_D_C_And_Way как возвращала всегда false, так и будет возвращать. Независимо от состояния макроса M_D_C.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 11.04.2025 8:10 rg45 . Предыдущая версия .
Re[5]: Накидайте плиз задачек на знание языка Си++
От: B0FEE664  
Дата: 11.04.25 08:15
Оценка: -1 :)
Здравствуйте, rg45, Вы писали:

R>Я больше скажу, если даже исправить эту ошибку, то ничего в том примере не изменится. isM_D_C_And_Way как возвращала всегда false, так и будет возвращать. Независимо от состояния макроса M_D_C.


В этом примере — да, а в реальности Mode читается из файла.
И каждый день — без права на ошибку...
Re[6]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 11.04.25 08:24
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>В этом примере — да, а в реальности Mode читается из файла.


Ну вот этот момент вносит определённую долю удивления при чтении примера. Логика примера теряется. Получается, что все эти "много букв" только ради того, чтоб труднее было найти пропущенные скобки. Возможно, имело бы смысл показать только объявление GetMode.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 11.04.2025 8:26 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.