C++ “是怎么回事?”;而(a%5)";及;而(五)";不是语法错误吗?

C++ “是怎么回事?”;而(a%5)";及;而(五)";不是语法错误吗?,c++,C++,在解决问题时,我在while循环中多次遇到这种特殊情况: while(a%5) statement; 或者类似的 while(5) statement; 起初我认为这是某种打印错误或语法错误。但是当我尝试这个程序时,它工作得非常好!!它是如何工作的?不同于零的整数在C++中是真实的在条件求值为真的情况下,非零整数 0作为条件中的整数计算为false 为什么??编译器只是将条件表达式转换为布尔表达式 只要expression的计算结果为true,就会执行while(expres

在解决问题时,我在while循环中多次遇到这种特殊情况:

while(a%5)
    statement;
或者类似的

while(5)
    statement;

起初我认为这是某种打印错误或语法错误。但是当我尝试这个程序时,它工作得非常好!!它是如何工作的?

不同于零的整数在C++中是真实的

在条件求值为真的情况下,非零整数

0作为条件中的整数计算为false

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

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

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

只要表达式的结果为非零整数,则结果将为真

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

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

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

std::cout这是因为整数值可以转换为布尔值。州的第7.14节:

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

因此,整数值0被视为false,而任何其他整数值都被视为true


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

您认为它的哪一部分会出错?在知道您的期望是什么以及为什么之前,我们无法真正回答!while(1)在编写无限循环时是惯用的。可能作者感到厌烦,决定使用while(5)相反,网络结果是相同的。这叫做FWIW,你可能想链接到C++ 17标准,因为这是C++标签的现行标准。你可以得到HTML链接到其他标准:@ NaNaLover谢谢。更新以反映C++ 17。