c++ - 在 "if"语句中初始化变量

标签 c++ c++17

我读到在 C++17 中我们可以像这样在 if 语句中初始化变量

if (int length = 2; length == 2)
    //execute something

代替

int length = 2;
if (length == 2)
    //do something

即使它更短,它也会影响代码的可读性(尤其是对于不了解此新功能的人),我认为这对于大型软件开发来说是一种糟糕的编码习惯。

除了缩短代码之外,使用此功能还有什么好处吗?

最佳答案

它将 length 的范围限制为 if 单独。所以当我们被允许写作时,你会得到同样的好处

for(int i = 0; i < ... ; ++i) {
   // ...
}

而不是变量泄漏

int i;
for(i = 0; i < ... ; ++i) {
   // ...
}

短期变量更好有几个原因。但举几个例子:

  1. 生命越短,在阅读不相关的代码行时需要记住的事情就越少。如果 i 在循环或 if 语句之外不存在,那么我们不需要在意它在它们之外的值。我们也不必担心它的值会与超出其预期范围的程序的其他部分交互(如果上面的 i 在另一个循环中重用,可能会发生这种情况)。它使代码更易于理解和推理。

  2. 如果变量持有资源,则该资源现在持有的时间可能最短。这没有多余的花括号。还明确了资源与 if 单独相关。将此视为一个激励示例

    if(std::lock_guard _(mtx); guarded_thing.is_ready()) {
    }
    

如果您的同事不了解该功能,请教他们!安抚不想学习的程序员是回避功能的糟糕借口。

关于c++ - 在 "if"语句中初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866458/

相关文章:

c++ - 如何为动态类型语言构建编译器?

c++ - 如何区分存储在 QGraphicsScene.selectedItems() 上时继承 QGraphicsItems 的对象

c++ - 为什么不调用虚拟基础非默认构造函数,除非大多数派生基础显式调用它们?

c++ - 引用初始化和常量表达式

c++ - 在 API 和应用程序线程之间共享数据

c++ - 为什么强类型枚举可以用没有static_cast的整数初始化?

java - 编译器组件的良好源代码

c++ - 我可以声明一个模板只接受具有同质签名的函数吗?

c++ - 具有非常小块的持久映射缓冲区 (glBufferStorage GL_MAP_PERSISTENT_BIT)

c++ - 为什么与比较类不在同一个命名空间中时,std::variant无法找到operator <()