C++ 如何在if()语句中声明变量?

C++ 如何在if()语句中声明变量?,c++,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 i

可能重复:

而不是这个

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.
}

您能否声明一个变量并在
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!
   }
}

代替
怎么样

for (int value = get_value(); value > 100; value = 0) {
    //...
}
如果您想使用C++11,可以使用lambda:

[](int value = get_value()) {
    if (value > 100) {
        //...
        std::cout << "value:" << value;
    }
}();
[](int value=get_value()){
如果(值>100){
//...

std::cout如果您想要值的特定范围,可以引入范围块

#include <iostream>

int get_value() {
    return 101;
}

int main() {
    {
        int value = get_value();
        if(value > 100)
            std::cout << "Hey!";
    } //value out of scope
}
#包括
int get_值(){
返回101;
}
int main(){
{
int value=get_value();
如果(值>100)

std::cout或者您可以为嵌套范围添加一组额外的大括号,尽管它并不十分漂亮:

{
    int value = get_value();
    if ( value > 100 )
    {
        // Do something with value.
    }   
}
//now value is out of scope
把它放在一个函数中:

void goodName(int value) {
    if(value > 100) {
        // Do something with value.
    }
}

//...
    goodName(get_value());

在这种情况下,您可以预测:

if (int value = (get_value() > 100 ? get_value() : 0)) {
    ...
}

但我并不推荐它,它不适用于所有可能需要执行的测试,它调用
get_value()
两次。

您可以编写一个小函数,它可以为您进行比较,如果比较结果为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
,或者手动放大括号来缩小变量的范围

无论如何,我不会在生产代码中编写这样的代码


不要为机器编写代码。为人类编写代码。只要你遵循它们的语法,机器就会理解任何东西;人类理解它们可读的东西。因此可读性应该是你优先考虑的问题,而不是不必要的范围。

你能不能只做
如果(get_value()>100)
?@noko:如果你想对值做一些事情,就不需要了。你能再解释一下吗?你到底想做什么?@MayankSharma:我想不会。@MayankSharma:事实上,你不是这么说的!只写代码。因为这根本不容易出错或不易表达。我考虑(int-value=get\u-value();value>100;value=0)这是一个更好的。不需要使用<代码>破解< /代码>。使用C++ LAMBDA来使用一个需要订书机的锤子。我说,Worde!!!多么微风!1的真正优雅的解决方案。我要添加到我原来的问题,作为编辑,“没有引入范围块”。但是我想现在已经太晚了!@DrTwox:如果你加上这个限制,那么答案是“不”。@DrTwox:你仍然可以这样做!@PeterWood:其实不是这样的,为什么不
如果(get_value()>100){int value=get_value();…}
@Nawaz:因为提问者提出了一个人为的限制(也就是说,没有很好的理由——我不会用真正的代码来写,你的建议更好)。事实上,如果调用
get\u value()
的次数无关紧要,那么我可能根本不会将它分配给变量,只要在循环体中键入
get\u value()
,不管需要多少次:-)@SteveJessop:没有好的理由?限制变量的范围不是“没有好的理由”:@DrTwox:当然,如果没有提到,或者如果调用
get_value(),添加额外的块是我给出的“真实”答案
两次就可以了,那么纳瓦兹在上面的评论中所说的,在没有
else
子句的情况下,胜过了这一点。事实上,纳瓦兹的回答无论如何都是一个潜在的改进。我会稍加修改,我不喜欢第一个参数叫做
right
而第二个参数叫做
left
的函数的想法。@Hi Angel:你发布了吗你对错误答案的评论?似乎与我所说的无关。基本
if
语法没有“脆弱”之处,它总是“有效”。