C ++ kodu nasıl sona erdirilir


267

C ++ kodum belirli bir koşul karşılanırsa çalışmayı durdurmak istiyorum, ama bunu nasıl emin değilim. Yani herhangi bir noktada bir ifdeyim doğruysa kodu şu şekilde sonlandırın:

if (x==1)
{
    kill code;
}

98
Uygun mantık kullanın. Gelen main()kullanımı karşılığında, işlevlerin düzgün dönüş değeri kullanmak veya uygun bir İstisna atmak. Do not kullanmak exit()!
kay - SE kötüdür

6
@JonathanLeffler: NDEBUGTanımlı olarak derlendiğinde , assertbüyük olasılıkla bir işlem olmayacak, bu yüzden hata tespit etmekten daha fazlası için ona güvenmemelisiniz.
MvG

13
@jamesqf: a ' returndan main()mükemmel bir şekilde mantıklı. Program tarafından bildirilen çıkış kodunu işletim sistemine ayarlar; bu, birçok durumda yararlı olabilir (örneğin, programınız daha büyük bir işlemin parçası olarak kullanılabiliyorsa).
AAT

11
İlginçtir ki bu Q, kabul edilen cevabı oldukça farklı olan 5 yıl öncesinin bir kopyasıdır: stackoverflow.com/questions/1116493/how-to-quit-ac-program Sanırım bunu körü körüne öğrenmek 5 yıl sürdü std çağırmak :: çıkış kötü olabilir?
Brandin

5
Sorular Neden exit()kötü düşünülüyor? - SO 25141737 ve nasıl bir C ++ programından çıkmak için? - SO 1116493 artık bunun kopyası olarak kapalı. Bunlardan birincisi, yalnızca sağlam yazılım yazma hakkındaki düşüncelerinizi teşvik etmek için, göz atmaya değer olabilecek 'Sadece Çarpışma Yazılımına' atıfta bulunuyor.
Jonathan Leffler

Yanıtlar:


431

Birkaç yol vardır, ancak önce nesne temizlemenin neden önemli olduğunu anlamanız gerekir ve bu nedenle neden std::exitC ++ programcıları arasında marjinalleştirilir.

RAII ve Yığın Açma

C ++, basit bir şekilde nesnelerin yapıcıda başlatma ve yıkıcıda temizleme yapması gerektiği anlamına gelen RAII adı verilen bir deyim kullanır . Örneğin, std::ofstreamsınıf kurucu sırasında dosyayı açabilir, daha sonra kullanıcı üzerinde çıktı işlemleri gerçekleştirir ve son olarak yaşam döngüsünün sonunda, genellikle kapsamı ile belirlenir, esasen dosyayı kapatan ve yıkayan yıkıcı denir herhangi bir yazılı içerik diske.

Dosyayı yıkamak ve kapatmak için yıkıcıya ulaşmazsanız ne olur? Kim bilir! Ama muhtemelen dosyaya yazması gereken tüm verileri yazmaz.

Örneğin bu kodu düşünün

#include <fstream>
#include <exception>
#include <memory>

void inner_mad()
{
    throw std::exception();
}

void mad()
{
    auto ptr = std::make_unique<int>();
    inner_mad();
}

int main()
{
    std::ofstream os("file.txt");
    os << "Content!!!";

    int possibility = /* either 1, 2, 3 or 4 */;

    if(possibility == 1)
        return 0;
    else if(possibility == 2)
        throw std::exception();
    else if(possibility == 3)
        mad();
    else if(possibility == 4)
        exit(0);
}

Her olasılıkta ne olur:

  • Olasılık 1: Geri Dönüş esas olarak mevcut fonksiyon kapsamını terk eder, böylece osyıkıcıyı çağırmanın ve dosyayı diske kapatarak ve temizleyerek düzgün temizleme yapmanın ömrünün sona ermesini bilir .
  • Olasılık 2: İstisna atmak, mevcut kapsamdaki nesnelerin yaşam döngüsünü de halleder, böylece uygun temizlik yapar ...
  • Olasılık 3: Burada yığın çözme işlemi devreye giriyor! İstisna atıldığında bile inner_mad, çözücü yığını madve maindüzgün temizleme gerçekleştirmek için gidecek, ptrve dahil olmak üzere tüm nesneler doğru şekilde yok edilecek os.
  • Olasılık 4: Burada mı? exitbir C fonksiyonudur ve C ++ deyimlerinin farkında veya uyumlu değildir. O değil de dahil olmak üzere nesneler üzerinde temizleme gerçekleştirmek osaynı kapsamda. Bu nedenle dosyanız düzgün bir şekilde kapatılmayacak ve bu nedenle içerik asla üzerine yazılamayabilir!
  • Diğer Olasılıklar: Örtük bir performans göstererek return 0ve böylece olasılık 1 ile aynı etkiye, yani uygun temizliğe sahip olarak ana kapsamı terk edecektir.

Ama size az önce söylediğim şeyden o kadar emin olma (özellikle 2 ve 3 olasılıklar); okumaya devam ederseniz, kural dışı durum tabanlı uygun bir temizleme işlemini nasıl yapacağımızı öğreneceğiz.

Sonlandırmanın Olası Yolları

Anadan dön!

Bunu mümkün olduğunda yapmalısınız; her zaman ana programdan uygun bir çıkış durumu döndürerek programınızdan dönmeyi tercih edin.

Programınızın arayanı ve muhtemelen işletim sistemi, programınızın ne yapması gerektiğini başarılı bir şekilde yapıp yapmadığını bilmek isteyebilir. Aynı nedenden ötürü sıfıra dönmelisiniz ya da EXIT_SUCCESSprogramın başarıyla sonlandırıldığını ve programın başarısız bir şekilde sonlandırıldığını belirtmek için EXIT_FAILUREbaşka herhangi bir dönüş değeri biçimi uygulama tanımlıdır ( §18.5 / 8 ).

Ancak, çağrı yığınında çok derin olabilirsiniz ve hepsini geri döndürmek acı verici olabilir ...

Bir istisna atmayın

Bir istisna atmak, daha önce herhangi bir kapsamdaki her nesnenin yıkıcısını çağırarak yığın çözmeyi kullanarak uygun nesne temizliğini gerçekleştirir.

Ama işte yakalama ! Bir yığın istisnası işlenmediğinde (catch (...) yantümcesi ile) veya noexceptçağrı yığının ortasında bir fonksiyonunuz olsa bile yığın çözme işleminin gerçekleştirilip gerçekleştirilmediği uygulama tarafından tanımlanır . Bu, §15.5.1'de [sona ermek hariç] belirtilmiştir :

  1. Bazı durumlarda, daha az ince hata işleme teknikleri için kural dışı durum işleme terk edilmelidir. [Not: Bu durumlar:

    [...]

    - istisna işleme mekanizması atılan bir istisna için bir işleyici bulamadığında (15.3) veya bir işleyici (15.3) aranmasınoexcept , istisnaya izin vermeyen bir belirtime (15.4) sahip bir fonksiyonun en dıştaki bloğuyla karşılaştığında veya [...]

    [...]

  2. Bu gibi durumlarda, std :: terminate () denir (18.8.3). Hiçbir eşleşen işleyici bulunmadığı durumda, std :: terminate () çağrılmadan önce yığının açılmış olup olmadığı uygulama tanımlıdır [...]

Yani onu yakalamak zorundayız!

Bir istisna atmak ve ana yakalamak!

Yakalanmayan istisnalar yığın çözme gerçekleştiremeyebileceğinden (ve dolayısıyla düzgün temizleme gerçekleştirmeyeceğinden) , istisnayı ana olarak yakalamalı ve ardından bir çıkış durumu ( EXIT_SUCCESSveya EXIT_FAILURE) döndürmeliyiz .

Yani muhtemelen iyi bir kurulum:

int main()
{
    /* ... */
    try
    {
        // Insert code that will return by throwing a exception.
    }
    catch(const std::exception&)  // Consider using a custom exception type for intentional
    {                             // throws. A good idea might be a `return_exception`.
        return EXIT_FAILURE;
    }
    /* ... */
}

[Yapma] std :: çıkış

Bu, herhangi bir yığın çözme gerçekleştirmez ve yığın üzerindeki hiçbir canlı nesne, temizleme işlemi için ilgili yıkıcısını çağırmaz.

Bu, §3.6.1 / 4 [basic.start.init] içinde uygulanır :

Geçerli bloktan ayrılmadan programın sonlandırılması (örneğin, std :: exit (int) (18.5) işlevini çağırarak) otomatik saklama süresine (12.4) sahip herhangi bir nesneyi yok etmez . Stad veya iş parçacığı depolama süresi olan bir nesnenin imhası sırasında bir programı sonlandırmak için std :: exit çağrılırsa, programın tanımlanmamış davranışı vardır.

Şimdi düşünün, neden böyle bir şey yapasınız ki? Acı kaç nesneye zarar verdiniz?

Diğer [kötü olarak] alternatifler

Bir programı sonlandırmanın (çökme dışında) başka yolları da vardır, ancak önerilmez. Sadece açıklama uğruna burada sunulacaklar. Uyarı nasıl Normal program sonlanması değil ortalama yığın gevşemek ama tamam işletim sistemi için devlet.

  • std::_Exit normal bir program sonlandırmasına neden olur ve hepsi bu kadar.
  • std::quick_exitprogram sonlandırılmasına neden olur ve std::at_quick_exitişleyicileri çağırır , başka bir temizleme gerçekleştirilmez.
  • std::exitprogram sonlandırılmasına neden olur ve std::atexitişleyicileri çağırır . Statik nesne yıkıcılarını çağırmak gibi diğer temizleme işlemleri de gerçekleştirilir.
  • std::abortprogramın sonlandırılmasına neden oluyor, temizleme yapılmıyor. Program gerçekten, gerçekten beklenmedik bir şekilde sonlandırıldıysa bu çağrılmalıdır. İşletim sistemine anormal sonlandırma hakkında sinyal vermekten başka bir şey yapmaz. Bazı sistemler bu durumda bir çekirdek dökümü gerçekleştirir.
  • std::terminateçağrıları std::terminate_handlerçağrıları hangi std::abortvarsayılan olarak.

25
Bu oldukça bilgilendirici: (bazı örneğin özellikle ben her yerde işlenmiyor durum atma fark asla newatar std::bad_allocve programınızı o istisna hiçbir yerinde yakalamak için unuttum) değil düzgün sonlanan önce yığını gevşeyin. Bu benim için saçma görünüyor: o çağrısına sarmak esasen kolay olurdu mainönemsiz içinde try{- }catch(...){}(hiçbir ücret ödemeden düzgün, bu gibi durumlarda yapılır gevşemek yığını sağlayacak bloğun hangi Acımasız: Bu kullanarak programlar değil ödeyecek hiçbir ceza). Bunun yapılmamasının özel bir nedeni var mı?
Marc van Leeuwen

12
@MarcvanLeeuwen olası bir neden hata ayıklamadır: işlenmeyen bir istisna atılır atılmaz hata ayıklayıcıya girmek istersiniz. Yığını açmak ve temizleme yapmak, hata ayıklamak istediğiniz çökmeye neden olan içeriği silecektir. Hata ayıklayıcı yoksa, postmortem analiz yapılabilmesi için çekirdeği boşaltmak daha iyi olabilir.
Hugh Allen

11
Bazen tarayıcım hata veriyor (flaşı suçluyorum) ve birkaç gigabayt RAM tüketiyor ve işletim sistemim sayfaları her şeyi yavaşlatan sabit sürücüye atıyor. Tarayıcıyı kapattığımda uygun yığın çözme yapıyor, yani tüm bu gigabayt RAM'leri sabit sürücüden okuyor ve bir dakika kadar sürecek olan serbest bırakılmak üzere belleğe kopyalanıyor. Bunun std::abortyerine işletim sistemi tüm bellek, soketler ve dosya tanımlayıcıları bir dakika boyunca değiştirmeden serbest bırakabilsinler.
nwp

2
@nwp, duyguyu anlıyorum. Ancak anında öldürmek dosyaları bozabilir, en son sekmelerimi kaydetmeyebilir, vb :)
Paul Draper

2
@PaulDraper Bir tarayıcı güç kaybından önce açtığım sekmeleri geri yükleyemezse kesinlikle tolere edilebilir olduğunu düşünmem. Tabii ki yeni bir sekme açmış olsaydım ve henüz kaydedecek zamanım olmamış olsaydı, kaybolurdu. Ama bunun dışında, onu kaybetmenin bir mazereti olmadığını söylüyorum.
kasperd

61

Martin York'un belirttiği gibi, çıkış, dönüş gibi gerekli temizliği yapmaz.

Çıkış yerine dönüşü kullanmak her zaman daha iyidir. Eğer ana programda değilseniz, programdan çıkmak istediğiniz her yerde, önce ana ekrana dönün.

Aşağıdaki örneği ele alalım. Aşağıdaki programda, belirtilen içeriğe sahip bir dosya oluşturulacaktır. Ancak, dönüş yorumlanırsa ve çıkarılmadan çıkarsa (0), derleyici dosyanın gerekli metne sahip olacağını garanti etmez.

int main()
{
    ofstream os("out.txt");
    os << "Hello, Can you see me!\n";
    return(0);
    //exit(0);
}

Sadece bu değil, bir programda birden fazla çıkış noktasına sahip olmak hata ayıklamayı zorlaştıracaktır. Çıkışı yalnızca gerekçelendirilebildiğinde kullanın.


2
Biraz daha büyük bir programda bu davranışa ulaşmak için ne öneriyorsunuz? Koddan daha derin bir yerde, programdan çıkması gereken bir hata durumu tetiklenirse, her zaman temiz olarak nasıl anaya dönersiniz?
Janusz

5
@Janusz, Bu durumda, önceden tanımlanmış bir değer döndürmezseniz, istisnaları kullanabilir / atabilirsiniz, örn. İşlevden bir dönüş değerine sahip olabilirsiniz; örneğin, başarılı olduğunda 0, hata durumunda 1, ancak yürütmeye devam et , Hata durumunda -1 ve programdan çıkın. İşlevdeki dönüş değerini temel alır, bu bir başarısızlık varsa, daha fazla temizleme etkinliği gerçekleştirdikten sonra ana öğeden geri dönmeniz yeterlidir. Son olarak, çıkışı akıllıca kullanın, bundan kaçınmak istemiyorum.
Narendra N

1
@NarendraN, "gerekli temizleme" belirsiz - işletim sistemi (Windows / Linux) bellek ve dosya tanıtıcılarının düzgün bir şekilde serbest bırakıldığına dikkat edecektir. "Eksik" dosya çıktısına gelince: Bunun gerçek bir sorun olabileceği konusunda ısrar ediyorsanız, bkz. Stackoverflow.com/questions/14105650/how-does-stdflush-work Bir hata durumunuz varsa, doğru günlük kaydı programınızın tanımlanmamış bir duruma ulaştıysanız, kayıt noktanızın hemen önünde bir kesme noktası ayarlayabilirsiniz. Bu hata ayıklamayı nasıl zorlaştırıyor?
Markus

2
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

Modern C için kullanmak ++ return (EXIT_SUCCESS);yerinereturn(0)
Jonas Stein

39

std::exitİşlevi çağırın .   


2
Bu işlevi çağırdığınızda hangi nesnelerin yıkıcıları çağrılır?
Rob Kennedy

37
exit () geri dönmez. Böylece yığın çözme gerçekleşemez. Küresel nesneler bile yok edilmez. Ancak atexit () ile kaydedilen fonksiyonlar çağrılır.
Martin York

16
Lütfen exit()kütüphane kodunuz ana bilgisayar işlemim içinde çalışırken çağırma - sonrakiler hiçbir yerin ortasından çıkacaktır.
sharptooth

5
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

23

İnsanlar "çağrı çıkışı (dönüş kodu)" diyor, ama bu kötü bir form. Küçük programlarda sorun yok, ancak bununla ilgili bir takım sorunlar var:

  1. Programdan birden fazla çıkış noktasına sahip olursunuz
  2. Kodu daha kıvrımlı hale getirir (goto kullanmak gibi)
  3. Çalışma zamanında ayrılan belleği serbest bırakamaz

Gerçekten, problemden çıkmanız gereken tek zaman main.cpp'deki bu satırda:

return 0;

Hataları ele almak için exit () yöntemini kullanıyorsanız, çok daha zarif ve güvenli bir yöntem olarak istisnalar (ve yuvalama istisnaları) hakkında bilgi edinmelisiniz.


9
Çok iş parçacıklı bir ortamda, main () ile farklı bir iş parçacığına atılan bir istisna ele alınmaz - alt iş parçacığının süresi dolmadan önce bazı manuel çapraz iş parçacığı iletişimi gerekir.
Steve Gilham

3
1. ve 2. programcıya bağlıdır, uygun günlük kaydı ile, exeuction sonsuza dek durduğundan bu bir sorun değildir. 3 gelince: Bu sadece yanlıştır, işletim sistemi hafızayı boşaltacaktır - belki gömülü cihazları / gerçek zamanlı hariç, ama bunu yapıyorsanız, muhtemelen eşyalarınızı biliyorsunuzdur.
Markus

1
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

1
Bir hata oluşursa, 0 döndürmemelisiniz. 1 (veya muhtemelen başka bir değer döndürmelisiniz, ancak 1 her zaman güvenli bir seçimdir).
Kef Schecter

14

return 0;istediğiniz yere koyduğunuzda int main()program hemen kapanacaktır.


the-nightman, @ evan-carslake ve herkes, ben de bu SO sorusunun # 36707 bir dönüş ifadesinin rutin herhangi bir yerde meydana gelip gelmeyeceği hakkında bir tartışma verdiğini eklerim . Bu bir çözüm; ancak, duruma bağlı olarak, bunun en iyi çözüm olduğunu söyleyemem.
localhost

1
OP bu konuda hiçbir şey söylemedi, bu yüzden kod fonksiyon içinde olması gerektiğini varsaymak oldukça döküntü olduğunu düşünüyorum main.
Marc van Leeuwen

@localhost Bir iade ifadesi, her koşulda, her koşulda tamamen isteğe bağlıdır. Ancak, int main()farklı. Program başlangıç int main()ve bitiş için kullanılır. Bunu yapmanın başka bir yolu yok. Program siz true veya false olana kadar çalışır. Hemen hemen her zaman 1 veya true değerini döndürürsünüz, programın doğru bir şekilde kapatıldığını belirtmek için (ör: belleği serbest bırakamıyorsanız veya herhangi bir nedenden dolayı yanlış kullanabilir.) Programın kendisini bitirmesine izin vermek her zaman kötü bir fikirdir, örneğin:int main() { int x = 2; int foo = x*5; std::cout << "blah"; }
Evan Carslake

@EvanCarslake Anlaşıldı, eğer bu soru için başka bir yerde gönderdiğim bir yorum fark ederseniz, bu konuda aşinayım int main; ancak, ana rutinde birden fazla dönüş ifadesine sahip olmak her zaman iyi bir fikir değildir. Potansiyel bir uyarı, kod okunabilirliğini artırmaktır; ancak, kodun belirli kod bölümlerinin o uygulama durumunda çalışmasını önlemek için durumu değiştiren bir boole bayrağı gibi bir şey kullanmak. Şahsen, çoğu uygulamayı daha okunabilir hale getiren ortak bir iade ifadesi buluyorum. Son olarak, çıkıştan önce bellek temizleme ve G / Ç nesnelerini düzgün şekilde kapatma ile ilgili sorular.
localhost

2
Eğer döndürmez @EvanCarslake truegelen maindoğru bittiğini belirtmek için. Normal sonlandırmayı belirtmek için sıfırı veya EXIT_SUCCESS(veya isterseniz falseörtük olarak sıfıra dönüştürülecek) döndürmeniz gerekir . Başarısızlığı belirtmek için geri dönebilirsiniz EXIT_FAILURE. Diğer herhangi bir kod anlamı uygulama tanımlıdır (POSIX sistemlerinde gerçek hata kodu anlamına gelir).
Ruslan

11

Yürütme akışı ana işlevin sonuna geldiğinde program sonlanır.

O zamandan önce sonlandırmak için, durum programı başlatanlara döndürülen bir değer olan çıkış (int durum) işlevini kullanabilirsiniz. 0 normalde hata olmayan bir durumu gösterir


2
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

11

Ya değerinizden bir değer döndürün mainya da exitişlevi kullanın . Her ikisi de bir int alır. Dönüş değerini izleyen harici bir işleminiz yoksa hangi değeri döndürdüğünüz gerçekten önemli değildir.


3
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

11

Kodun derinliklerinde bir yerde bir hatayla karşılaşırsanız, bir istisna atın veya hata kodunu ayarlayın. Hata kodlarını ayarlamak yerine her zaman bir istisna atmak daha iyidir.


2
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

9

Genellikle exit()yöntemi uygun çıkış durumuyla kullanırsınız .

Sıfır başarılı bir koşu anlamına gelir. Sıfırdan farklı bir durum bir tür sorunun oluştuğunu gösterir. Bu çıkış kodu, bir işlemin başarılı bir şekilde çalışıp çalışmadığını belirlemek için üst işlemler (örn. Kabuk komut dosyaları) tarafından kullanılır.


1
MAYIS çıkışını kullanmak bir tasarım sorununuz olduğu anlamına gelir. Bir program doğru bir şekilde nefes alırsa, yalnızca ana programdan çıkmalıdır return 0;. Sanırım exit()böyle assert(false);ve bu yüzden sadece erken yakalama sorunları yakalamak için kullanılmalıdır.
CoffeDeveloper

2
Bu yanıt, bir C ++ programından çıkma sorusundan birleştirildiğini unutmayın. - SO 1116493 . Bu cevap, bu soru sorulmadan yaklaşık 6 yıl önce yazılmıştır.
Jonathan Leffler

7

Çıkış (hata_kodu) çağrısının ötesinde - atexit işleyicilerini çağırır, ancak RAII yıkıcılarını vb. Çağırmaz - daha fazla istisna kullanıyorum.

Ana programım giderek daha fazla

int main(int argc, char** argv) 
{
    try {
        exit( secondary_main(argc, argv );
    }
    catch(...) {
        // optionally, print something like "unexpected or unknown exception caught by main"
        exit(1);
    }
}

burada ikincil_main, başlangıçta yerleştirilen tüm öğelerin yerleştirildiği - yani orijinal ana, ikincil_alan olarak yeniden adlandırılır ve yukarıdaki saplama ana eklenir. Bu sadece bir inceliktir, böylece tepsi ve ana yakalama arasında çok fazla kod yoktur.

İsterseniz, diğer istisna türlerini yakalayın.
Oldukça std :: string veya char * gibi dize hata türlerini yakalamak ve ana yakalamak işleyicisi yazdırmak gibi.

Bunun gibi istisnalar kullanmak, temizleme yapabilmeleri için en azından RAII yıkıcılarının çağrılmasına izin verir. Hangi hoş ve yararlı olabilir.

Genel olarak, C hata işleme - çıkış ve sinyaller - ve C ++ hata işleme - deneme / yakalama / atma istisnaları - en iyi şekilde birlikte oynarlar.

Ardından, bir hata tespit ettiğiniz yerde

throw "error message"

veya daha spesifik bir istisna türü olabilir.


Bu arada: Dinamik bellek tahsisi içerebilen dize gibi bir veri türünün kullanılmasının, belleğin tükenmesi ile ilgili olabilecek istisnalar için bir istisna işleyicisi içinde veya çevresinde iyi bir fikir olmadığının farkındayım. C stili dize sabitleri sorun değildir.
Krazy Glew

1
exitProgramınızda arama yapmanın bir anlamı yok . İçinde bulunduğunuz için main, sadece yapabilirsiniz return exitCode;.
Ruslan

-1

İf ifadeniz Loop'ta ise kullanabilirsiniz

 break; 

Bazı kodlardan kaçmak ve döngüye devam etmek istiyorsanız Kullan:

devam et;

İf ifadeniz Loop'ta değilse:

 return 0;

Or 




  exit();

-2

Dostum ... exit()işlevi stdlib.h altında tanımlanır

Bu yüzden bir önişlemci eklemeniz gerekiyor.

include stdlib.hÜstbilgi bölümüne koy

Sonra exit();istediğiniz yerde kullanın ancak çıkış parantezine bir tamsayı koymayı unutmayın.

Örneğin:

exit(0);

-2

Test ettiğim durum gerçekten kötü bir haberse, bunu yaparım:

*(int*) NULL= 0;

Bu bana durumu inceleyebileceğim güzel bir coredump veriyor.


4
Tanımlanmamış davranışa neden olduğu için bu durum en iyi duruma getirilebilir. Aslında, böyle bir ifadeye sahip olan tüm yürütme dalı derleyici tarafından silinebilir.
Ruslan

-2

Bir koşulu kırmak için dönüşü (0) kullanın;

Yani, sizin durumunuzda:

    if(x==1)
    {
        return 0;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.