"while (a%5)"和"while (5)"如何不是语法错误?

How is "while (a%5)" and "while (5)" not a syntax error?

本文关键字:while 语法 错误 a%5 何不      更新时间:2023-10-16

很多时候,在解决问题时,我在while循环中遇到了这个特殊情况:

while(a%5)
    statement;

或类似的东西

while(5)
    statement;

起初我以为这是某种打印错误或语法错误。但是当我尝试该程序时,它运行良好!!它是如何工作的?

不同于零的整数在C++中为真值

条件中的非零整数计算为 true

作为条件中的整数的零计算结果为 false

为什么? 编译器只是将条件表达式强制转换为布尔值。

只要expression计算结果为 true,就会执行while(expression)条件的主体。

编译器尝试将表达式强制转换为布尔值。 除 0 以外的整数将转换为 true,而 0 将转换为 false。

只要表达式产生非零整数,结果将为 true。

如果您的表达式没有对布尔值的隐式或显式强制转换,则会出现问题。 此外,如果您不理解表达式的隐式转换,则会出现问题。

例如,假设您有以下代码:

int a = 6;
while(a % 5) {
   std::cout << "a is " << a << std::endl;
   a--;
}

a%5 在第一个循环开始时的计算结果为 1,在第二个循环开始时计算为 0。 因此,不会在第二个循环中评估身体。

这是有效的,因为整数值可以转换为布尔值。 C++17 标准的第 7.14 节规定:

算术、无作用域枚举、指针或指向的指针的 prvalue 成员类型可以转换为 bool 类型的 prvalue 。零值, 空指针值,或空成员指针值转换为假 ;任何其他值都将转换为 true。用于直接初始化 (11.6(,可以将 std::nullptr_t 类型的 prvalue 转换为 prvalue 布尔类型;结果值为 假 。

因此,整数值

0 被视为 false,而任何其他整数值被视为 true。

在您的示例中,while(a%5) 表示只要 a 不能被 5 整除,循环就会执行。 对于while(5)来说,这将是一个无限循环。