Aracılığıyla paylaş


if-else deyimi (C++)

If-else deyimi koşullu dallanmayı denetler. içindeki if-branch deyimleri yalnızca sıfır olmayan bir değere (veya true) değerlendirilirse condition yürütülür. değeri condition sıfırdan farklıysa aşağıdaki deyim yürütülür ve isteğe bağlı else deyimini izleyen deyim atlanır. Aksi takdirde, aşağıdaki deyim atlanır ve bir else varsa aşağıdaki deyimi else yürütülür.

condition sıfır olmayan olarak değerlendirilen ifadeler şunlardır:

  • true
  • null olmayan bir işaretçi,
  • sıfır olmayan aritmetik değerler veya
  • aritmetik, boole veya işaretçi türüne kesin olmayan bir dönüştürme tanımlayan bir sınıf türü. (Dönüştürmeler hakkında bilgi için bkz. Standart Dönüştürmeler.)

Sözdizimi

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqTercihdecl-specifier-seqdeclaratorbrace-or-equal-initializer

statement:
expression-statement
compound-statement

expression-statement:
expressionTercih;

compound-statement:
{statement-seqTercih}

statement-seq:
statement
statement-seq statement

if-branch:
statement

else-branch:
statement

selection-statement:
ifconstexpropt17init-statement(opt17condition)if-branch
ifconstexpropt17init-statement(opt17condition)if-branchelseelse-branch

17 Bu isteğe bağlı öğe C++17'den itibaren kullanılabilir.

if-else deyimleri

Deyiminin if tüm biçimlerinde, conditionbir yapı dışında herhangi bir değere sahip olabilecek, tüm yan etkiler de dahil olmak üzere değerlendirilir. Denetim, yürütülen if-branch veya bir , continueveya gotoelse-branch içermediği sürece deyiminden if programdaki sonraki breakdeyime geçer.

Deyimin elseif...else yan tümcesi, karşılık gelen else deyimi olmayan aynı kapsamdaki en yakın önceki if deyimle ilişkilendirilir.

Örnek

Bu örnek kod, hem ile hem de olmadan elsekullanımda olan çeşitli if deyimleri gösterir:

// if_else_statement.cpp
#include <iostream>

using namespace std;

int main()
{
    int x = 10;

    if (x < 11)
    {
        cout << "x < 11 is true!\n";  // executed
    }
    else
    {
        cout << "x < 11 is false!\n"; // not executed
    }

    // no else statement
    bool flag = false;
    if (flag == true)
    {
        x = 100; // not executed
    }

    int *p = new int(25);
    if (p)
    {
        cout << *p << "\n"; // outputs 25
    }
    else
    {
        cout << "p is null!\n"; // executed if memory allocation fails
    }
}

Çıkış:

x < 11 is true!
25

başlatıcısı olan if deyimi

C++17'den başlayarak, deyim if adlandırılmış bir init-statement değişkeni bildiren ve başlatan bir ifade de içerebilir. Değişken yalnızca if-deyimi kapsamında gerekli olduğunda if-deyiminin bu biçimini kullanın. Microsoft'a özgü: Bu form Visual Studio 2017 sürüm 15.3'den itibaren kullanılabilir ve en azından /std:c++17 derleyici seçeneğini gerektirir.

Örnek

// Compile with /std:c++17

#include <iostream>
#include <mutex>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

map<int, string> m{ {1, "one"}, {2, "two"}, {10,"ten"} };
mutex mx;
bool shared_flag = true; // guarded by mx
int getValue() { return 42; }

int main()
{
    if (auto it = m.find(10); it != m.end())
    {
        cout << it->second << "\n";
    }

    if (int x = getValue(); x == 42)
    {
        cout << "x is 42\n";
    }

    if (lock_guard<mutex> lock(mx); shared_flag)
    {
        cout << "setting shared_flag to false\n";
        shared_flag = false;
    }

    string s{ "if" };
    if (auto keywords = { "if", "for", "while" }; any_of(keywords.begin(), keywords.end(), [&s](const char* kw) { return s == kw; }))
    {
        cout << "Error! Token must not be a keyword\n";
    }
}

Çıkış:

ten
x is 42
setting shared_flag to false
Error! Token must not be a keyword

if constexpr deyimleri

C++17'den başlayarak, birden çok işlev aşırı yüklemesine başvurmak zorunda kalmadan derleme zamanı dallanma kararları almak için işlev şablonlarındaki bir if constexpr deyimi kullanabilirsiniz. Microsoft'a özgü: Bu form Visual Studio 2017 sürüm 15.3'den itibaren kullanılabilir ve en azından /std:c++17 derleyici seçeneğini gerektirir.

Örnek

Bu örnekte, bir şablona gönderilen türe göre nasıl koşullu olarak derleyebileceğiniz gösterilmektedir:

// Compile with /std:c++17
#include <iostream>

template<typename T>
auto Show(T t)
{
    //if (std::is_pointer_v<T>) // Show(a) results in compiler error for return *t. Show(b) results in compiler error for return t.
    if constexpr (std::is_pointer_v<T>) // This statement goes away for Show(a)
    {
        return *t;
    }
    else
    {
        return t;
    }
}

int main()
{
    int a = 42;
    int* pB = &a;

    std::cout << Show(a) << "\n"; // prints "42"
    std::cout << Show(pB) << "\n"; // prints "42"
}

deyimi if constexpr derleme zamanında değerlendirilir ve derleyici yalnızca işlev şablonuna gönderilen bağımsız değişkenin türüyle eşleşen dal için if kod oluşturur. deyimini if constexpr açıklama satırı yaparsanız ve deyiminin if açıklamasını çıkarırsanız, derleyici her iki dal için de kod oluşturur. Bu, bir hata almanız anlamına gelir:

  • deyimi false olmasına ve kodun hiçbir zaman yürütülmemesine rağmenif, çağrısı ShowValue(a); yaparsanız işaretçi olmadığından bir hata return *tt alırsınız.
  • deyimi true olmasına ve kodun hiçbir zaman yürütülmemesine rağmen, çağrısı ShowValue(pB); yaparsanız bir işaretçi olduğu için t bir hata return t alırsınız.if

Yalnızca if constexpr işlev şablonuna gönderilen bağımsız değişkenin türüyle eşleşen deyim derlendiğinden, bu sorunu çözer.

Çıkış:

42
42

Ayrıca bkz.

Seçim Deyimleri
Anahtar Sözcükler
switch Deyim (C++)