Как объявить переменную внутри оператора if()?
Возможный дубликат:
Объявление и инициализация переменной в инструкции Conditional или Control в С++
Вместо этого...
int value = get_value();
if ( value > 100 )
{
// Do something with value.
}
... можно уменьшить объем значения только там, где это необходимо:
if ( int value = get_value() > 100 )
{
// Obviously this doesn't work. get_value() > 100 returns true,
// which is implicitly converted to 1 and assigned to value.
}
Ответы
Ответ 1
Если вам нужна определенная область для значения, вы можете ввести блок видимости.
#include <iostream>
int get_value() {
return 101;
}
int main() {
{
int value = get_value();
if(value > 100)
std::cout << "Hey!";
} //value out of scope
}
Ответ 2
Можете ли вы объявить переменную и сравнить ее в инструкции if()
? Нет.
Можете ли вы объявить переменную и сравнить ее таким образом, чтобы область жестко привязана к блоку if()
? Да
Вы можете объявить переменную:
if (int x = 5) {
// lol!
}
или вы можете делать что-то с одним:
int x = foo();
if (x == 5) {
// wahey!
}
Вы не можете обойти оба!
Вы можете немного обмануть, где единственное, что вам нужно сделать, это сравнить с true
, потому что само объявление оценивает значение нового объекта.
Итак, если у вас есть:
int foo()
{
return 0;
}
Затем это:
if (int x = foo()) {
// never reached
}
эквивалентно:
{
int x = foo();
if (x) {
// never reached
}
}
Этот окончательный синтаксис, используя отдельный блок области видимости, также является вашей золотой пулей для более сложных выражений:
{
int x = foo();
if (x > bar()) {
// wahooza!
}
}
Ответ 3
Поместите его в функцию:
void goodName(int value) {
if(value > 100) {
// Do something with value.
}
}
//...
goodName(get_value());
Ответ 4
Как использовать for
вместо?
for (int value = get_value(); value > 100; value = 0) {
//...
}
Если вы хотите перейти на С++ 11, вы можете использовать lambda:
[](int value = get_value()) {
if (value > 100) {
//...
std::cout << "value:" << value;
}
}();
Ответ 5
Или вы можете просто добавить дополнительный набор фигурных скобок для вложенной области, хотя это не совсем красиво:
{
int value = get_value();
if ( value > 100 )
{
// Do something with value.
}
}
//now value is out of scope
Ответ 6
Вы можете написать небольшую функцию, которая может выполнить сравнение для вас и вернуть значение, если сравнение возвращает true, иначе return 0
, чтобы избежать выполнения блока if
:
int greater_than(int right, int left)
{
return left > right ? left : 0;
}
Затем используйте его как:
if ( int value = greater_than(100, get_value()))
{
//wow!
}
Или вы можете использовать for
, как сказал другой ответ. Или вручную поместите фигурные скобки, чтобы уменьшить область действия переменной.
Во всяком случае, я бы не написал такой код в производственном коде.
Не записывайте код для машин. Напишите код для людей. Машины будут понимать что угодно, пока вы будете следовать их грамматике; люди понимают, что им читается. Поэтому читаемость должна быть вашим приоритетом по сравнению с ненужным охватом.
Ответ 7
В этом конкретном случае вы можете использовать его:
if (int value = (get_value() > 100 ? get_value() : 0)) {
...
}
Я действительно не рекомендую это делать. Он не работает для всех возможных тестов, которые вы, возможно, захотите выполнить, и дважды вызывает get_value()
.