Завершення програми C++
Функція, оголошена exit в , завершує програму C++. Значення, надане як аргумент exit , повертається операційній системі як код програми або коду виходу, що повертається. Прийнято, щоб нульовим кодом повернення позначалося, що програму завершено успішно. Константи EXIT_FAILURE можна використовувати, а EXIT_SUCCESS також визначені в , щоб вказати на успішність або збій програми.
Функція abort
Функція abort , оголошена стандартному форматі, включає , завершує програму C++. Різниця між exit та abort полягає в тому, що exit обробка завершення середовища виконання C++ виконується (викликається глобальні деструктори об'єктів). abort негайно завершує програму. Функція abort проходить звичайний процес знищення ініціалізованих глобальних статичних об'єктів. Також здійснюється обхід усієї спеціальної обробки, яка була задана за допомогою функції atexit.
Корпорація Майкрософт: з міркувань сумісності Windows реалізація abort microsoft може дозволити виконання коду завершення бібліотеки DLL за певних обставин. Для отримання додаткових відомостей див. розділ abort.
Функція atexit
Використовуйте функцію atexit , щоб вказати дії, які виконуються до завершення програми. Перед виконанням функції виходу не ініціалізовані глобальні статичні об'єкти, ініціалізовані перед викликом atexit.
return оператор in main
Інструкція return дозволяє вказати значення, що повертається з main . Оператор return у main першу чергу діє як будь-яка інша інструкція return. Усі автоматичні змінні знищуються. main Потім викликає повертається exit значення як параметр. Розглянемо наступний приклад:
// return_statement.cpp #include struct S < int value; >; int main() < S s < 3 >; exit(3); // or return 3; >
return Оператори exit, описані в попередньому прикладі, мають аналогічну поведінку.Як завершити програму, так і повернути значення 3 операційній системі. Різниця полягає в тому, що exit не знищує автоматичну змінну s, а return оператор робить.
Як правило, C++ вимагає, щоб функції, що мають типи, що повертаються, відмінні від void значення, що повертається. Функція є винятком. Вона main може завершитися без інструкції return . У цьому випадку він повертає значення, що залежить від реалізації, у процес, що викликає. (За промовчанням MSVC повертає значення 0.)
Знищення потоків та статичних об'єктів
При викликі exit безпосередньо (або при викликі після оператора з main ) об'єкти потоків, пов'язані з поточним потоком return знищуються. Потім статичні об'єкти знищуються у зворотному порядку їх ініціалізації (після викликів функцій, зазначених у , якщо такі є atexit ). У наступному прикладі показано виконання такого процесу ініціалізації та видалення.
приклад
У прикладі статичні об'єкти sd1 створюються і sd2 ініціалізовані перед записом main . Після завершення роботи цієї програми за допомогою інструкції return спочатку sd2 знищується, а потім sd1. Деструктор класу ShowData закриває файли, пов'язані з цими статичними об'єктами.
// using_exit_or_return1.cpp #include class ShowData < public // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w"); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on output device. void Disp (char * szData) <fputs (szData, OutputDev); >private: FILE *OutputDev; >; // Define static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define інший static object of type ShowData. output // directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Іншим способом написання цього коду є оголошення ShowData об'єктів з областю блокування, яка неявно знищує їх при виході з області:
Перервати виконання програми в консолі
Під час виконання, зрозуміло. наприклад, якщо не задовольняється будь-яка умова. оператор break; не пропонувати.
3 відповіді 3
Найправильніший спосіб перервати виконання коду на якомусь його учатську - це оператор return. У Вашому випадку його просто необхідно вставити в потрібне місце у методі main.
Якщо з якихось причин він Вам не підходить, то є ще кілька способів:
- System.Environment.Exit() – завершення поточного процесу.
- System.Threading.Thread.CurrentThread.Abort() - вирішення поточного потоку винятком System.Threading.ThreadAbortException .
Перший із запропонованих варіантів Вам цілком підійде, але подумайте ще раз про структуру програми.
Натисніть Ctrl+C під час виконання. приклад
using System; class Hello < static void Main() < for (int i = 0; i < 1000000; i++) Console.WriteLine("hello, world"); >>
34.7k 27 27 золотих знаків 101 101 срібний знак 219 219 бронзових знаків
- return #код_повернення; (якщо вихід повинен виробляється з головної "main()`" функції)
- Environment.Exit(#код_повернення);
Подібні
Підписатися на стрічку
Для підписки на стрічку скопіюйте та вставте це посилання у вашу програму для читання RSS.
Site design/logo © 2024 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2024.11.28.19452
Як перервати виконання програми Java?
Знаю, що можна використовувати System.exit(0), але проти такого переривання це не зовсім коректно. Один шлях передаю за допомогою аргументу, другий вбиваю. Хотілося б дізнатися, як перервати програму, якщо одного зі шляхів немає. Був ще такий варіант:
if (path == null) return;
Але хотілося б дізнатися який варіант був би оптимальніший у моєму випадку. Тому що розгалуження if/else не зовсім люблю. Бажано, щоб це оброблялося у catch.
public class Task implements AutoCloseable < public static void main(String[] args) throws IOException < String DownloadFile = "C:\Users\IdeaProjects\Task\src\main\resources\Out.txt"; Mapdepartments = New HashMap<>(); String path = args.length > 0? args[0]: null; read(path, departments); transferToDepartment(departments, DownloadFile); > public static void read(String path, Map departments) throws IOException < assert path != null; try (BufferedReader br = New BufferedReader(New InputStreamReader(New FileInputStream(path), "CP1251"))); br) < . >System.out.println("Читуваний файл закритий"); > catch (FileNotFoundException e) < System.out.println("Файл не знайдено, перевірте шлях"); >catch (ArrayIndexOutOfBoundsException e) < System.out.println("Виправте шлях до файлу, виходьте за масив"); >catch (NullPointerException e) < System.out.println("Ви забули прописати шлях до файлу"); >> public static void transferToDepartment(map departments, String downloadFile) < . uploadToFile(download, downloadFile); >private static void uploadToFile(List download, String path) < int i = 0; try (FileWriter writer = новий FileWriter(path, false)) < while (i < download.size()) < writer.write((String) download.get(i)); writer.write('\n'); i++; >System.out.println("Читуваний файл закритий"); > catch (IOException ex) < System.out.println(ex.getMessage()); >> @Override public void close() < System.out.println("Читуваний файл закритий"); >>