Добавление операторов переключения логических выражений в C ++?

Я практикую операторы switch в C ++, и мне было интересно, могу ли я добавить логическое выражение и как, как будто это аналог if / else. Возможно ли это включить?

Вот мой скелетный код:

#include "stdafx.h"#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
#include <random>

using namespace std;int main()
{
int HouseValue;
cout << "Enter your total house value estimate:";
cin >> HouseValue;

switch (HouseValue)
{
case 1:
(HouseValue < 100000 && HouseValue > 50000);
cout << "";
break;
case 2:
(HouseValue < 250000 && HouseValue > 100000);
cout << "";
break;
case 3:
(HouseValue < 500000 && HouseValue > 250000);
cout << "";
break;
case 4:
(HouseValue < 1000000 && HouseValue > 500000);
cout << "";
break;
case 5:
(HouseValue < 3000000 && HouseValue > 1000000);
cout << "";
break;
}
return 0;
}

2

Решение

Вы не можете напрямую использовать условия в переключателе, так как они требуют выражения постоянной времени компиляции. В любом случае вы подходите не хватает какой-либо ветви для точных значений (например, HouseValue == 100000) и это излишне.

Самое простое решение — использовать if/else цепь:

if (HouseValue < 50000)
...
else if (HouseValue < 100000)
...
else if (HouseValue < 250000)
...
else if (HouseValue < 500000)
...
5

Другие решения

Нет. C ++ не имеет такой структуры переключателей: switch используется только с константами.

Реализация C ++ для этой структуры управления

if (HouseValue >= 50000 && HouseValue < 100000) {
...
} else if (HouseValue >= 100000 && HouseValue < 150000) {
...
} else if (HouseValue >= 150000 && HouseValue < 200000) {
...
} else {
...
}

или, немного упрощая

if (HouseValue >= 50000 && HouseValue < 100000) {
...
} else if (HouseValue < 150000) {
...
} else if (HouseValue < 200000) {
...
} else {
...
}
1

Вы Можно проявить творческий подход со значением switch() Eval при выводе значений вашего дела. Например:

switch((HouseValue + 50000)/50000)

приведет к следующей таблице потенциальных результатов из-за целочисленное деление:

HouseValue (N)           (HouseValue + 50000)/50000
===================================================
0      <= N < 50000                  1
50000  <= N < 100000                 2
100000 <= N < 150000                 3
etc...

Я не испорчу удовольствие от выяснения, какие значения использовать в уравнении для получения конкретных диапазонов, которые вы ищете (или, если это вообще возможно). Я скажу тебе это. Помните, что упоминалось о «проваливании» ярлыка конкретного случая на следующий, если вы не предоставите break ? Да, это может пригодиться.

Короче говоря, никто не сказал, что вы должны switch на входное значение напрямую. Вы всегда можете использовать выражение, основанное на вашем входном значении, при условии, что case метки являются константами, у вас есть много места, чтобы шевелиться.

Удачи.

1

Нет, так нельзя сделать.

switch утверждение не было введено в язык как простой «синтаксический сахар» для цепочки if, switch Заявление было введено специально для обеспечения более структурированной замены функциональности «параметризованного перехода», т.е. goto с целью перехода во время выполнения, которая может быть немедленно получена из значения параметра. switch Нужно всегда сразу знать, куда именно прыгнуть. В этом вся идея switch заявление. Ваши условия не соответствуют этой идее. (Со второй мысли, они вроде как, но все же они «слишком сложны» оригинальным switch стандарты.)

То, что вы пытаетесь сделать, реализуется через цепочку if, Если вам это не нравится, вы можете изобрести что-то еще, например, какую-то коллекцию диапазонов, которая может эффективно генерировать целочисленный индекс диапазона (1, 2, 3 и т. Д.) Из заданного HouseValue, Что вы сможете сделать switch по этому индексу. (См. Ответ @ WhozCraig.)

Конечно, так как ваш HouseValue целое число, вы можете сделать switch с ярлыками на корпусах, которые охватывают все возможные HouseValue ценности, но это не имеет никакого значения, кроме чисто юмористического.

Следует также отметить, что некоторые компиляторы (например, GCC) поддерживают «ранжированные» метки регистра в swicth заявления, как

switch (HouseValue)
{
case 50000 ... 100000:
...
break;
case 100000 ... 250000:
...
break;
...
}

Но это нестандартное расширение языка.

1

Другое решение: таблица поиска с указателями на функции.

typedef void (*Ptr_Processing_Function)(void);

void Process_Range_1(void);
void Process_Range_2(void);
void Process_Range_3(void)

struct Range_Entry
{
unsigned int lower_price;
unsigned int high_price;
Ptr_Processing_function process_function;
};

const Range_Entry table[] =
{
{50000, 10000, Process_Range_1},
{10000, 15000, Process_Range_2},
//...
};
const unsigned int entries_in_table =
sizeof(table) / sizeof(table[0]);

//...
cin >> price;
for (unsigned int i = 0; i < entries_in_table; ++i)
{
if ((price >= table[i].lower_price) && (price < table[i].high_price))
{
table[i].processing_function();
break;
}
}
1

Вот еще одно решение, просто подключи ValueBracket(HouseValue) в выключателе вместо

static const std::array<int, 6> Values = { 50000, 100000, 250000, 500000, 1000000, 3000001 };
size_t ValueBracket(int value) {
return std::lower_bound(Values.begin(), Values.end(), value) - Values.begin();
}

и добавьте следующие 2 случая

case 0:
cout << "you live in a shed peasant, go away";
break;
default:
cout << "sorry my Lord, we can't sell your castle here";
break;

Психотический случай

constexpr int Return1() {
return 1;
}switch(index) {
case Return1():
break;
}

Это может быть просто GCC, который счастлив …

Но регистром могут быть только константы времени компиляции типа constexpr …

1

Я знаю, что я слишком опоздал на вечеринку, но вы можете превратить это в выключатель, как это:

int mycase = HouseValue / 50000;

switch (mycase) {
case 0: /* HouseValue < 50000) */
...
case 1: /* HouseValue >= 50000 && HouseValue < 100000 */
...
case 2: /* HouseValue >= 100000 && HouseValue < 250000 */
case 3:
case 4:
case 5:
...
/* etc */
}

Таким образом, вы торгуете (возможной) оценкой 5 операторов if против одного деления int и прыжка. Измерьте, что быстрее для вашего варианта использования.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector