可能重复:
Declaring and initializing a variable in a Conditional or Control statement in C++
而不是......
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.
}
答案 0 :(得分:20)
如果您想要特定的值范围,可以引入范围块。
#include <iostream>
int get_value() {
return 101;
}
int main() {
{
int value = get_value();
if(value > 100)
std::cout << "Hey!";
} //value out of scope
}
答案 1 :(得分:12)
你能声明一个变量并在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!
}
}
答案 2 :(得分:6)
把它放在一个函数中:
void goodName(int value) {
if(value > 100) {
// Do something with value.
}
}
//...
goodName(get_value());
答案 3 :(得分:4)
如何使用for
呢?
for (int value = get_value(); value > 100; value = 0) {
//...
}
如果你想使用C ++ 11,你可以使用lambda:
[](int value = get_value()) {
if (value > 100) {
//...
std::cout << "value:" << value;
}
}();
答案 4 :(得分:1)
或者你可以为嵌套作用域添加一组额外的大括号,虽然它不是很漂亮:
{
int value = get_value();
if ( value > 100 )
{
// Do something with value.
}
}
//now value is out of scope
答案 5 :(得分:1)
您可以编写一个可以进行比较的小函数,并返回if比较返回true的值,否则返回0
以避免执行if
块:
int greater_than(int right, int left)
{
return left > right ? left : 0;
}
然后将其用作:
if ( int value = greater_than(100, get_value()))
{
//wow!
}
或者您可以使用for
作为其他答案说。或者手动放置大括号以减小变量的范围。
无论如何,我会不在生产代码中编写此类代码。
不要为机器编写代码。为人类编写代码。只要你遵循他们的语法,机器就能理解任何东西;人类理解他们可读的东西。因此,可读性应优先于不必要的范围。
答案 6 :(得分:0)
在这种特殊情况下,你可以提出它:
if (int value = (get_value() > 100 ? get_value() : 0)) {
...
}
但是,我并不是真的推荐它。它不适用于您可能要执行的所有可能的测试,并且它会调用get_value()
两次。