为什么变量声明作为for循环的条件运行良好?

Fel*_*ara 20 c++ for-loop declaration language-lawyer

什么是声明的返回值/类型int i = 5

为什么不编译这段代码:

#include <iostream>

void foo(void) {
    std::cout << "Hello";
}

int main()
{
    int i = 0;
    for(foo(); (int i = 5)==5 ; ++i)std::cout << i; 
}
Run Code Online (Sandbox Code Playgroud)

虽然这样做

#include <iostream>

void foo(void) {
    std::cout << "Hello";
}

int main()
{
    int i = 0;
    for(foo(); int i = 5; ++i)std::cout << i; 
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 25

用于循环要求条件是要么表达式或声明:

条件 - 要么

  • 一个上下文可转换为bool的表达式.在每次迭代之前计算此表达式,如果它生成false,则退出循环.
  • 使用brace-or-equals初始化程序声明单个变量.在每次迭代之前评估初始化程序,如果声明的变量的值转换为false,则退出循环.

第一个代码不起作用,因为(int i = 5)==5它根本不是有效的表达式.(它也不是声明.)操作数operator==也应该是一个表达式,但它int i = 5是一个声明,而不是表达式.

第二个代码有效,因为int i = 5匹配条件的第二个有效情况; 使用等于初始值设定项的单个变量的声明.价值i将转换bool为判断; 这总是5,然后导致无限循环.