assert和cerr
cerr的作用和用法
cerr用于在本地运行时输出一些变量的中间结果,但是提交时评测机不会把cerr的输出放入标准输出,所以cerr可以不被注释掉,参与本地地调试输出,极少量(如一两条)且不在循环内的 cerr 通常不会造成 TLE,但提交前最好养成全部注释或删除的习惯,避免遗忘。由于每次cerr会进行一次系统调用,消耗时间。如果在循环调用cerr可能会导致能够AC的代码TLE。所以尽量在提交时注释掉所有的cerr
assert的作用和用法
assert语句(断言)只在没有#define NDEBUG的情况下生效,否则可以视作无效语句(一般评测机和用户本地是不会去#define NDEBUG,所以assert语句都能生效)
安全起见,只用assert判断一个bool式是否成立,如assert(idx<block);、assert(n<5)。意义就是"程序执行到这里时必须保证该不等式成立(bool值为true)"。如果该不等式成立,就是断言成功,程序继续执行;否则断言失败,整个程序会立刻 调用 std::abort()并且立即终止 。可以写成assert(exp && "提示语句"),这样在断言失败时终端就会输出提示语句,可用于区分不同的assert。
注意,assert务必不要写一些不清晰的式子,如:assert(i); assert(i++);
两者在提交时的比较
assert很好用,完全不需要注释掉assert语句再提交。如果对于某个测试用例发生了断言失败,评测机会立即返回RE,而不是WA,这省去了大量的debug时间。而且断言成功时开销极小,不用担心因为写了assert语句导致不必要的TLE。
但是cerr语句最好注释掉,大量cerr语句会导致不必要的TLE。原因前文已经表述过。