"while (a%5)"和"while (5)"如何不是语法错误?
How is "while (a%5)" and "while (5)" not a syntax error?
很多时候,在解决问题时,我在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)
来说,这将是一个无限循环。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么我不能在 while 循环中创建线程?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- "while (a%5)"和"while (5)"如何不是语法错误?
- Opencv 语法错误:在"while"之前缺少";"
- 不理解while循环语法
- while 循环条件中的语法是什么