在变量声明中使用for循环

4

我能在变量声明中使用for循环吗?

int main() {
    int a = {
        int b = 0;
        for (int i = 0; i < 5; i++) {
            b += i;
        }
        return b;
    };

    printf("%d", a);
}

2
使用函数/lambda。 - zdf
2个回答

8
您可以使用lambda表达式:
int main() {
    int a = []{
        int b = 0;
        for (int i = 0; i < 5; i++) {
            b += i;
        }
        return b;
    }();

    printf("%d", a);
}

注意,如果您尝试存储lambda函数,则必须立即执行它。因此,在结尾处需要额外加上()

如果您打算多次实例化重用lambda函数,则可以将其单独存储,如下所示:

int main() {
    auto doCalculation = []{
        int b = 0;
        for (int i = 0; i < 5; i++) {
            b += i;
        }
        return b;
    };

    int a = doCalculation();

    printf("%d", a);
}

如果您需要在多个作用域中使用它,请改用函数。

谢谢!如果我想在a的上面再声明一个变量(unsigned char x = 7),并且想要返回x*b,会出现“error: void value not ignored as it ought to be”和“error: ‘x’ is not captured”的错误提示。 - John Doe
你需要捕捉它,例如[x]{},但没有代码很难说。请阅读更多关于Lambda和捕获的内容,例如在这里https://en.cppreference.com/w/cpp/language/lambda或简单地搜索该术语,那么你将会发现许多教程。 - deW1
太感谢了!我只是不知道这个术语。 - John Doe
我们这里不是在谈论声明,甚至不是定义。我们正在谈论初始化,特别是复制初始化。请参见此处:https://en.cppreference.com/w/cpp/language/copy_initialization。但是有大量的赞和一个被接受的答案,所以一切都很好。我给你点个赞。如果我们要严格一点:对于给定的问题,唯一正确的答案就是:“不,不可能”。 - A M

0

实际上已经由C++委员会准备好了..
constexpr有许多尚未探索的用处

constexpr int b(int l) {
            int b=0;
            for (int i = 0; i < l; i++)
                b += i;
            return b;
        }

int main() {

    constexpr int a = b(5);

    printf("%d", a);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接