c++ - 虽然循环超过限制
问题描述
while (('\0' != *str1) && ('\0' != *str2) &&
(false == sensi) ? (std::toupper(*str1) == std::toupper(*str2)) : (*str1 == *str2)) {
++str1;
++str2;
}
此代码甚至在 NULL 终止符之后继续循环。
一定有一些非常明显的东西我在这里遗漏了,但我根本看不到它。
如果这两个代码之间的任何一个代码块&&
被评估为假,它应该会中断,但它不会这样做,并且会继续解析字符串,甚至超过 NULL 终止符变成乱码。
解决方案
while (('\0' != *str1) && ('\0' != *str2) &&
(false == sensi) ? (std::toupper(*str1) == std::toupper(*str2)) : (*str1 == *str2))
三元运算符?:
的优先级低于几乎所有其他运算符,包括逻辑 AND &&
。因此,&&
首先应用 s,因此您在这里所说的是:
- if
str1
is not at itsNUL
terminator,&&
str2
is not at its own,&&
我们不区分大小写, - 然后
?
循环while
字符串的当前字符不区分大小写, - else
:
循环while
字符串的当前字符完全相等。
因此,如果字符串相等,或者至少越过它们的NUL
终止符并进入未定义的行为区域,您将永远循环。
相反,您的意思是,我们将整个三元表达式包装在括号中,以覆盖其默认优先级,从而使语言将其评估为 的第三个条件&&
:
while ( *str1 != '\0' && *str2 != '\0' &&
(!sensi ? std::toupper(*str1) == std::toupper(*str2) : *str1 == *str2) )
即循环while
:
str1
不在其NUL
终结者处,&&
str2
不是自己的,&&
(
?:
字符串的当前字符以 .指定的方式相等sensi
)
。
我建议在这里查看运算符优先级,不要过度使用多余的括号,也不要使用 Yoda 条件。此外,这个大的复合条件也许最好表示为一个单独的函数,将 2str
秒作为输入并分别检查每个条件,以避免混淆长逻辑测试。
推荐阅读
- python - Python 3 - 在没有 \n 的情况下将文本写入文件
- javascript - 使用 jquery 滑动菜单
- c# - Bing maps API:有没有办法将卡车路线用于距离矩阵?
- ios - 检查位置是否已知
- rust - 尝试在返回迭代器的闭包内改变状态时,Rust 错误“无法推断借用表达式的适当生命周期”
- angular - 使用复选框获取动态生成的 Ionic 列表中所选项目的值
- z3 - 我们能否解决 Z3 中的一组约束,其中 ForAll 量词下的一些变量具有一系列值?
- file - UNIX 'ls' 命令排除不需要的文件
- pandas - 如何将多个镶木地板文件附加到 Pandas 中的一个数据框
- javascript - 如何使 for 循环等待/异步?