是case statement1 + statement2:糟糕的编码?
我已经写了,看起来像这样的switch语句:是case statement1 + statement2:糟糕的编码?
switch(statement){
case statement1:
break;
case statement2:
break;
case statement3:
break;
case statement4:
break;
case statement1 + statement2:
break;
case statement1 + statement3:
break;
case statement1 + statement4:
break;
default:
break;
}
与标题中定义的这样的语句:#define statement1 999
#define statement2 32898
#define statement3 32899
#define statement4 32900
这编译并工作正常使用visual studio 2003.
对我而言,这是提供更多的陈述而不需要定义更多的变量。根据之前的代码中选择的语句,允许我有不同的选项。
社区如何看待此代码?公认?不好的做法?避免的?
我能看到的唯一风险是如果有定义33897,33898,33899。
嗯,虽然我不喜欢开关,但我认为你的代码可以提高很多。
首先,在开关中使用运算符没有错。你可以使用任何你想要的constexpr事物。对整数的操作是constexpr。
我会改变的事情是这样的:
const int statement1 = 999;
const int statement2 = 32898;
const int statement3 = 32899;
const int statement4 = 32900;
我会用constexpr
如果C++ 11是可用的。
宏可以隐藏黑幕,比如函数调用和复杂操作。现在它们是整数,可以在编译时使用。
除此之外,常数很难读懂,特别是那些名字。你可以在编译时使用constexpr函数产生这些常量的值,或者简单地给它们一个更好的名字并且可能对它进行注释。
在switch语句中添加整数在实践中并不差,但正如您所说,我能看到的唯一风险是是否存在定义33897,33898,33899。这就是为什么您应该给结果赋予意义这些操作。如果33897是真的,你要测试的值,那么做到这一点:
const int combine2 = statement1 + statement2;
const int combine3 = statement1 + statement3;
您可以定义那些在您非常的功能,如果你不希望他们在全局范围内。
像其他答案一样,这个数字常量的选择不好。 –
我拿OP给我们的常量。我可以添加一些答案,可以说明这一点。 –
我的观点是,这些常量是不好的,它们实际上是一个比使用宏更糟糕的问题,所以它们需要在一个完整的答案中处理。问题不在于常量很难阅读。他们**导致错误**,因为他们不是两个幂,所以不同的常量组合会导致相同的值。 –
尽可能避免#define。是的,这是一个不好的做法。
您可以用constexpr做到这一点:
constexpr int statement1 = 2;
,你可以做同样的事情。但你会得到更多的表现力和类型安全。
规则是,案例标签基本上需要编译时数字常量。你问到的更多是个人风格问题,这是一个非常主观的问题,在这里不太适合。 –
if-else语句对我来说似乎更好。 –
@Someprogrammerdude哦,不,这是非常客观可怕的。(a)因为常量不是2个标志的权力,所以它们的加法不会产生唯一的值,并且(b)使它们变成宏而不是不变,这会导致名称污染。 –