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-seq
Tercihdecl-specifier-seq
declarator
brace-or-equal-initializer
statement
:
expression-statement
compound-statement
expression-statement
:
expression
Tercih;
compound-statement
:
{
statement-seq
Tercih}
statement-seq
:
statement
statement-seq
statement
if-branch
:
statement
else-branch
:
statement
selection-statement
:
if
constexpr
opt17init-statement
(
opt17condition
)
if-branch
if
constexpr
opt17init-statement
(
opt17condition
)
if-branch
else
else-branch
17 Bu isteğe bağlı öğe C++17'den itibaren kullanılabilir.
if-else deyimleri
Deyiminin if
tüm biçimlerinde, condition
bir 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 , continue
veya goto
else-branch
içermediği sürece deyiminden if
programdaki sonraki break
deyime geçer.
Deyimin else
if...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 else
kullanı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ğmen
if
, çağrısıShowValue(a);
yaparsanız işaretçi olmadığından bir hatareturn *t
t
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çint
bir hatareturn 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin