assert 是调试阶段用于检查内部逻辑错误的宏,仅在 NDEBUG 未定义时生效,应避免副作用、不用于用户输入校验,只做纯条件判断。
assert 是 C++ 标准库提供的宏(定义在 中),用于在**调试阶段**检查程序逻辑是否符合预期。它不是错误处理机制,也不该用来验证用户输入或外部数据——那些必须用 if + 显式错误路径。
它的作用很明确:当表达式为假(false 或 0)时,立即中止程序并打印失败位置(文件名、行号、断言条件)。仅在 NDEBUG 未定义时生效;一旦定义(如 Release 编译常用),所有 assert 调用会被预处理器完全移除,零开销。
assert(argv[1] != nullptr) 在命令行没传参时会崩溃,但这是合法的运行情况assert(x++ > 0) 会导致 Debug 和 Release 行为不一致核心原则是:只放纯判断,不修改状态,且语义清晰可读。
assert(ptr != nullptr) 比 assert(ptr) 更明确意图assert((i >= 0 && i
assert(a == b) 对 float/double 极不可靠,改用误差范围:assert(std::abs(a - b)
能信,但得理解它的定位:assert 是开发期“逻辑守卫”,不是产品级健壮性保障。
assert 在 Debug 下频繁触发,说明那里存在真实逻辑缺陷,必须修复,不能靠加 NDEBUG 掩盖if (condition) { throw std::logic_error("..."); }
这些写法看似省事,实际埋雷:
assert(fopen("data.txt",
"r")) —— 文件不存在是常态,不是逻辑错误;应该检查返回值并走错误分支assert(i++ —— Debug 下 i 自增一次,Release 下不自增,行为分裂assert(func()),而 func() 有 IO 或修改全局状态 —— 同样导致 Debug/Release 不一致assert,又没加 #include —— 编译失败,且错误提示可能指向奇怪位置断言本身很简单,难的是判断“这里到底该不该断”。真正卡住人的,永远是问题边界的界定,而不是语法。