c++ - 为什么 if 语句中的 strlen 行为异常?
问题描述
#include <stdio.h>
#include <string.h>
int main()
{
const char str[11]= "Hello World";
if(-1 > strlen(str)){
printf(str);
}
return 0;
}
这个 if 条件应该总是返回 false。但这里不是。但是,如果我将strlen(str)
值赋给另一个变量并与之进行比较,那么它会按预期工作。我在这里缺少什么?它是编译器依赖还是什么?
解决方案
strlen
返回一个unsigned
类型。
这具有转换-1
为unsigned
类型的效果,这是一个很大的数字。
该数字将大于strlen
结果,因此程序控制到达if
语句体。
如果您将值分配给类型strlen
变量signed
,并使用该变量进行比较,则-1
不会发生转换,并且if
语句将按预期运行。
请注意,从技术上讲,您的代码行为是未定义的,该字符串(用于NUL
终止符)需要 12 个元素,而不是 11 个,并且strlen
需要该NUL
终止符才能正常工作。最好让编译器进行计数,通过编写
const char str[] = "Hello World";
推荐阅读
- python - 无法让 Celery 使用 prod 设置处理数字海滴
- excel - VBA中的SaveAs保存在不同文件夹上方的文件夹中
- python - python:带有自定义查询参数的rest api
- linux - 无法从 Raspberry Pi 启动 WiFi 直接连接到 andoird 设备
- html - 如何使用 Visual Basic 和 mvc 核心从按钮调用函数
- python - 如何在 Django ORM 中实现多个左连接
- python - 如何获取 Pandas df.merge() 不匹配的列名
- javascript - 最后一个括号集的正则表达式匹配内容
- docker - Rancher - 无法为主机获取 /health:TLS 握手超时
- python - 如何获得 huggingface.transformers Trainer 的每个 epoch 或 step 的准确性?