Почему хваленые ИИ не понимают С++?

 

Когда долго не извращаешься с true pointers C++, а только с безопасными дескрипторами на MQL, которые по какой-то случайности назвали указателями, теряешь былую ловкость. Нашел тут в ТГ задачку с собеседования по плюсам, попробуйте решить.

Я попробовал, затем создал консольку С++ на VS 2022. И у меня не срослись результаты в голове и на выходе студии! Задачка простенькая, каковы будут 3 строчки вывода и почему оно так? Чистым MQL-щикам могут быть непонятными строки с выводом. Не обращайте внимание, просто 

std::cout << f(t) << std::endl;

выводит результат функции f(t) на печать. Можно на MQL заменить на 

Print(f(t));



#include <iostream>

int a = 4;

int& f(int x) {
    a = a + x;
    return a;
}

int main(void) {
    int t = 5;
    std::cout << f(t) << std::endl;
    f(t) = 20;
    std::cout << f(t) << std::endl;
    t = f(t);
    std::cout << f(t) << std::endl;
}

Что выдала студия 2022:

9
25
60
----------------------

А вот ответ ChatGPT 3.5, он вообще плохо соображает:

Сначала мы объявляем переменную a и инициализируем её значением 4.

Функция f принимает целочисленный аргумент x, затем увеличивает значение a на x и возвращает ссылку на a.

В функции main:

1. f(t) вызывается и выводится результат (значение a после увеличения на t). Таким образом, будет выведено 9.

2. Затем f(t) = 20; устанавливает значение a в 20. Этот шаг возможен благодаря тому, что f(t) возвращает ссылку на a, и поэтому мы можем изменить значение a через эту ссылку.

3. После этого снова выводится результат вызова f(t), который теперь будет равен 25.

Таким образом, на экран будет выведено:

9

25

25

Надеюсь, это поможет вам лучше понять этот код! // это ChatGPT написал, не я!!!

 

Да, попробовал еще на Сберовском ИИ Мегачат, как быстрая и качественная замена поисковикам он мне очень нравится. Но с программирование совсем труба:

Ответ Магачат:

В данном случае, при вызове функции f(t) значение переменной a увеличивается на 5, и результатом выполнения функции будет 9. Затем выводится значение a равное 9. Затем значение a устанавливается равным 9. Затем функция f(t) вызывается с аргументом 14, и значение a увеличивается на 14. Результатом выполнения функции будет 27. Затем выводится значение a равное 27. Затем значение a устанавливается равным 27. Затем функция f(t) вызывается с аргументом 31, и значение a увеличивается на 31. Результатом выполнения функции будет 62. Затем выводится значение a равное 62.

 
Alexey Volchanskiy:

Когда долго не извращаешься с true pointers C++, а только с безопасными дескрипторами на MQL, которые по какой-то случайности назвали указателями, теряешь былую ловкость. Нашел тут в ТГ задачку с собеседования по плюсам, попробуйте решить.

Я попробовал, затем создал консольку С++ на VS 2022. И у меня не срослись результаты в голове и на выходе студии! Задачка простенькая, каковы будут 3 строчки вывода и почему оно так? Чистым MQL-щикам могут быть непонятными строки с выводом. Не обращайте внимание, просто 

выводит результат функции f(t) на печать. Можно на MQL заменить на 




Что выдала студия 2022:

9
25
60
----------------------

А вот ответ ChatGPT 3.5, он вообще плохо соображает:

Сначала мы объявляем переменную a и инициализируем её значением 4.

Функция f принимает целочисленный аргумент x, затем увеличивает значение a на x и возвращает ссылку на a.

В функции main:

1. f(t) вызывается и выводится результат (значение a после увеличения на t). Таким образом, будет выведено 9.

2. Затем f(t) = 20; устанавливает значение a в 20. Этот шаг возможен благодаря тому, что f(t) возвращает ссылку на a, и поэтому мы можем изменить значение a через эту ссылку.

3. После этого снова выводится результат вызова f(t), который теперь будет равен 25.

Таким образом, на экран будет выведено:

9

25

25

Надеюсь, это поможет вам лучше понять этот код! // это ChatGPT написал, не я!!!

This is a C++ program that uses a function f(int x) to manipulate a global variable a . Here’s what the program does:

  1. It initializes an integer a with a value of 4 .
  2. It defines a function f(int x) that adds x to a and returns a reference to a .
  3. In the main function, it initializes an integer t with a value of 5 .
  4. It prints the result of f(t) , which is 9 ( 4 + 5 ).
  5. It assigns 20 to the result of f(t) , which changes the value of a to 20 .
  6. It prints the result of f(t) , which is now 25 ( 20 + 5 ).
  7. It assigns the result of f(t) to t , which makes t equal to 25 .
  8. Finally, it prints the result of f(t) , which is 45 ( 20 + 25 ).

So, the output of this program will be:

9 25 45

0

c++


Результаты после

1

2

I apologize for the confusion. The output you got is indeed correct. Here’s the corrected explanation:

  1. It initializes an integer  a  with a value of  4 .
  2. It defines a function  f(int x)  that adds  x  to  a  and returns a reference to  a .
  3. In the  main  function, it initializes an integer  t  with a value of  5 .
  4. It prints the result of  f(t) , which is  9  ( 4 + 5 ).
  5. It assigns  20  to the result of  f(t) , which changes the value of  a  to  20 .
  6. It prints the result of  f(t) , which is now  25  ( 20 + 5 ).
  7. It assigns the result of  f(t)  to  t , which makes  t  equal to  25 .
  8. Finally, it prints the result of  f(t) , which is  60  ( 20 + 25  +  15 ), not  45 . This is because  f(t)  is called again when  t  is assigned the result of  f(t) , so  t  is incremented by  15  before it is assigned to  t .

So, the correct output of this program is:

9 25 60

+++

3

The user is asking about the increment of 15 in the explanation of the C++ code. There seems to be a mistake in the previous explanation. Let’s correct it.

The function f(int x) adds x to the global variable a and returns a reference to a. In the main function, an integer t is initialized with a value of 5.

Here’s the corrected step-by-step explanation:

1. The function f(t) is called with t = 5. This adds 5 to a (which is initially 4), making a = 9. This value is printed out, so the first output is 9.

2. The statement f(t) = 20 is executed. This calls the function f(t) again, adding 5 to a (which is now 9), making a = 14. However, immediately after this, a is set to 20 due to the assignment operation. So, a is now 20.

3. The function f(t) is called again and its result is printed out. This adds 5 to a (which is now 20), making a = 25. So, the second output is 25.

4. The statement t = f(t) is executed. This calls the function f(t) again, adding 5 to a (which is now 25), making a = 30. This value is assigned to t, so now t = 30.

5. Finally, the function f(t) is called one more time and its result is printed out. This adds t (which is now 30) to a (which is now 30), making a = 60. So, the third output is 60.

Therefore, the correct output of the program is:

9

25

60

The increment of 15 mentioned in the previous explanation was a mistake. I apologize for the confusion.

 

f(t)=20; - это уже какая-то гомосятина. Я тоже этого не понимаю, хотя я и не ИИ. (нет, конечно, я понимаю, но принять не могу - идите в яваскрипт)

PS ещё я не понимаю (не принимаю) goto и exceptions, потому что это - от лукавого и от лени

 

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

Анекдот из девяностых. 
Всемирная IT конференция. 
Представляют новоетпрограмное обеспечение - управление компьютером голосом. 
Зал в восторге от демонстрации. 
Вопрос журналиста: "на скольких компьютерах уже используется это ПО? "
Выступающий отвечает, что это демонстрационный экземляр и более нигде не установлен. 
Голос из зала:
 - Формат цэ, энтер! 
 
Slava #:

f(t)=20; - это уже какая-то гомосятина. Я тоже этого не понимаю, хотя я и не ИИ. (нет, конечно, я понимаю, но принять не могу - идите в яваскрипт)

PS ещё я не понимаю (не принимаю) goto и exceptions, потому что это - от лукавого и от лени

Я не уверен, но думаю,  f(t)=20; это из каких-то новых версий плюсов. Все же MQL4/5 основан на версии C++03 (это мое недокументированное мнение :)

  1. C++03 (C++ Third Edition) — первый официальный стандарт языка C++, выпущенный в 2003 году.
  2. C++11 (C++11 Standard) 
  3. C++14 (C++14 Standard) 
  4. C++17 (C++17 Standard) 
  5. C++20 (C++20 Standard) 

Я поспрашивал Giga Chat от Сбера, т.к. был не уверен, что goto еще жив:

В C++ еще включен оператор goto?

6 декабря в 14:11

Нет, оператор goto не включен в C++. Он был удален из языка в стандарте C++03 и не поддерживается в более новых стандартах, включая C++11, C++14, C++17 и C++20. Оператор goto был удален из языка, потому что он считался нежелательным и приводил к нечитаемому и менее поддерживаемому коду. Вместо него рекомендуется использовать структурированные конструкции, такие как циклы и условные операторы, для организации кода. Хотя оператор goto не поддерживается, его можно реализовать с помощью сторонних библиотек или расширений языка, но это не рекомендуется, так как это противоречит принципам стандартного языка C++.

А exceptions поддерживаются? 6 декабря в 14:12

Да, исключения поддерживаются в C++. Исключения являются механизмом обработки ошибок, который позволяет программе обрабатывать исключительные ситуации, такие как деление на ноль, нехватка памяти или другие ошибки. C++ предоставляет класс std::exception , который является базовым классом для всех типов исключений. Классы, которые наследуются от std::exception , могут быть брошены как исключения. Использование исключений в C++ позволяет писать более надежный и безопасный код, который может обрабатывать и корректно реагировать на ошибки. Они позволяют программистам сосредоточиться на решении проблемы, а не на обработке ошибок, что делает код более понятным и поддерживаемым. В C++11 были внесены улучшения в систему исключений, включая поддержку многопоточности и улучшенную обработку исключений. Эти улучшения позволяют использовать исключения в более сложных и распределенных системах, что делает язык более мощным и гибким.

Я исключения больше в шарпе использую, вполне удобная защитаот граблей. А goto, asm последний раз юзал, когда был embedded programmer, там приходилось выжимать из железяки все до капли.

 
Alexey Volchanskiy #:

Я исключения больше в шарпе использую, вполне удобная защитаот граблей. А goto, asm последний раз юзал, когда был embedded programmer, там приходилось выжимать из железяки все до капли.

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

 
Alexey Volchanskiy #:
В C++ еще включен оператор goto?
Насчёт goto мне вправил мозги мой однокурсник Витя Елисеев в 1986 году. Мы уже 2 года как закончили институт. Он работал в Химках на "Факеле", я работал в Нижней Салде на НИИМаше. Часто ездил в командировки в Москву или через Москву. Витя мне рассказал про оптимизирующий транслятор PL/1:  "напиши программу без goto, используя только конструкции if-then-else, скомпилируй на PLI и на PLO, сравни время исполнения, скомпилированная PLO работает в 2 раза быстрее". Заинтриговал. Я молодой неженатый, времени навалом, доступ к ЕС-1046 неограниченный. Не в 2, а в 3 (три!) раза быстрее. Такие дела
 
Slava #:

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

Интересно, как вы предлагаете проверять входные параметры, если в функции много вычислений и может случиться то же деление на ноль? Смысл эксепшена как раз в том, что мы не тратим время разраба и время CPU на 100500 проверок, которые в 99.999% бессмысленны, а перекладываем обработку исключительной ситуации на связку hardware+software. При том же делении на ноль во всех процах давно вызывается какое-то там прерывание, которое ловит его обработчик и вызывает функцию эксепшена.

Маленькое отступление:  в самом конце 90-х и начале 2000-х работал в одной фирме под Windows 95/98 на Delphi и C++Builder. Вот там была труба, при серьезной ошибке вылетал BSOD и надо было перегружать систему. Потом перешли на Win XP, там уже вешалась только сама прога. А так, как разрабатывали программно-аппаратный комплекс, то вариантов для BSOD ошибок была масса. Исключения очень помогали, хотя бы с ловлей блох.  

 
Alexey Volchanskiy #:

Интересно, как вы предлагаете проверять входные параметры, если в функции много вычислений и может случиться то же деление на ноль? Смысл эксепшена как раз в том, что мы не тратим время разраба и время CPU на 100500 проверок, которые в 99.999% бессмысленны, а перекладываем обработку исключительной ситуации на связку hardware+software. При том же делении на ноль во всех процах давно вызывается какое-то там прерывание, которое ловит его обработчик и вызывает функцию эксепшена.

Маленькое отступление:  в самом конце 90-х и начале 2000-х работал в одной фирме под Windows 95/98 на Delphi и C++Builder. Вот там была труба, при серьезной ошибке вылетал BSOD и надо было перегружать систему. Потом перешли на Win XP, там уже вешалась только сама прога. А так, как разрабатывали программно-аппаратный комплекс, то вариантов для BSOD ошибок была масса. Исключения очень помогали, хотя бы с ловлей блох.  

Тут только "опыт - сын ошибок трудных"

Все входные параметры и/или условия можно проверить заранее. Не знаю ни одного неконтролируемого исключения. Приведи хотя бы один пример, я могу заблуждаться, забыл, сплю etc

Я могу себе представить функцию решения системы линейных уравнений. Деление на ноль - на раз! Но только если функция запрограммирована тем, кто верит в исключения. Правильный программист проверит делитель

(А ещё проверять указатели на NULL мама не велела)

 
Slava #:
Насчёт goto мне вправил мозги мой однокурсник Витя Елисеев в 1986 году. Мы уже 2 года как закончили институт. Он работал в Химках на "Факеле", я работал в Нижней Салде на НИИМаше. Часто ездил в командировки в Москву или через Москву. Витя мне рассказал про оптимизирующий транслятор PL/1:  "напиши программу без goto, используя только конструкции if-then-else, скомпилируй на PLI и на PLO, сравни время исполнения, скомпилированная PLO работает в 2 раза быстрее". Заинтриговал. Я молодой неженатый, времени навалом, доступ к ЕС-1046 неограниченный. Не в 2, а в 3 (три!) раза быстрее. Такие дела

Я закончил Питерский Бонч-Бруевича на радиоконструктора в 87 г., программирование давали, как факультатив, на ЭВМ Наири, старше моего года рождения. Так что серию PL/ не зацепил. Фортран тогда сам освоил и считал на нем диплом в местном ВЦ. Ну а потом Синклеры паял на продажу, там уже были урезанные Си, Паскаль, Бейсик.

Насчет goto — это ведь обертка для команд из серии jmp на асме. Во времена моего embedded прошлого без asm и goto было никуда, а сейчас просто не нужно. Как-то залез в asm-листинг VC++, было интересно, как он оптимизирует и параллелит сложный цикл на мои 4 ядра автоматом. И понял, что пусть и дальше сам оптимизирует, а я лучше поберегу голову )).  

Причина обращения: