布尔表达式中带有 strlen() 的奇怪行为
Strange behavior w/ strlen() in boolean expression
今天我试图调试一个应用程序,我发现了包含strlen()的布尔表达式的奇怪行为。
下面是重现该问题的简单代码。
char test[20] = "testTestTest"; //the length is 12
bool b = 0 < (9 - strlen(test)); //should be false (0 < -3) = false
在执行结束时,b 为真,但应该是假的。
将 strlen() 的结果保存在变量中是有效的。
char test[20] = "testTestTest"; //the length is 12
int length = strlen(test); //save the length
bool b = 0 < (9 - length); //should be false (0 < -3) = false
在执行结束时,b 是假的(因为它应该是)。
两种实现之间有什么区别?
为什么第一个不起作用?
最初受影响的代码是这样的:
char test[20] = "testTestTest"; //the length is 12
for(int i = 0; i < (9 - strlen(test)); i++){
//do something (in my case I do NOT edit the test string)
}
for 循环应该永远不会执行(字符串>= 9),但它实际上是无限循环的。
将 strlen() 的结果保存在变量中是有效的。
您的变量与strlen()
返回的类型不同。正是从size_t
到int
的隐式转换使其正常工作。
非工作版本通常将9 - strlen(test)
评估为(size_t)9 - strlen(test)
,一个非常大的无符号数,而不是9 - (int)strlen(test)
负有符号数。
相关文章:
- 提升精神:解析布尔表达式并简化为规范范式
- C++ : 为什么必须添加布尔表达式?
- 我的作业问题:布尔表达式
- 是否可以定义以后可以计算的布尔表达式
- 布尔表达式的值是什么
- 布尔表达式的奇怪评估
- 布尔表达式是否像使用 if 或 switch 进行分支一样繁琐?
- 无限模板递归,因为没有布尔表达式优化,只有 gcc
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 注 961:违反 MISRA 2004 咨询规则 12.6,运算符所需的布尔表达式:"!"
- 使用提升的布尔表达式
- 在C++上给定布尔表达式的情况下分配整数值
- 布尔表达式的精神解析器
- 多个布尔表达式,而不重新插入变量
- C++ 循环和布尔表达式
- 编写布尔表达式以判断列表是否在增加
- 布尔表达式习语中的字符串文字是什么
- 布尔表达式在C++中解析和计算
- 布尔表达式中带有 strlen() 的奇怪行为
- C++:布尔表达式导致无限 while 循环