求教一点编程技巧assert和if

sdhsfhgfh 2013-02-19 02:28:32
编程时候有时用assert判断一个指针是否为空,有时候用if判断,如果不为空再用指针,有没有一些规则何时适合用assert断言,何时适合用if判断。
...全文
224 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2013-02-20
还有一种选择是永远不用assert
  • 打赏
  • 举报
回复
sdhsfhgfh 2013-02-20
引用 14 楼 zhao4zhong1 的回复:
还有一种选择是永远不用assert
但是用assert可以直接定位错误,但是用if虽然可以避免但是让错误更隐蔽了。是不是用assert后再用if是比较好的?
  • 打赏
  • 举报
回复
ShengFei01 2013-02-19
assert是断言,通常debug时用,release不起作用。 if是构建一个程序逻辑,总会执行。
  • 打赏
  • 举报
回复
whizer 2013-02-19
assert一般是用来检查bug,主要是用来检查致命的非正常的操作(如向PCI设备写东西,但是PCI设备根本就不存在),执行的最终结果是调用abort,即你的进程异常终止,这在软件发布上是致命的,不管怎么说你的程序至少要执行下去啊,别动不动就终止了. if是常规性的检查,包括参数判断,异常条件等等,判断的结果处理随你,你可以仅仅打印异常信息,可以终止程序.几乎所有assert能干的事,if都可以干.只是有些同学觉得方便就喜欢用assert. 因此,assert尽量少用,有些公司的c编程规范直接规定不能用assert. 下面是对assert的描述:

DESCRIPTION
     The assert() macro tests the given expression and if it is false, the
     calling process is terminated.  A diagnostic message is written to stderr
     and the function abort(3) is called, effectively terminating the program.
 
     If expression is true, the assert() macro does nothing.
 
     The assert() macro may be removed at compile time by defining NDEBUG as a
     macro (e.g., by using the cc(1) option -DNDEBUG).
 
EXAMPLES
     The assertion:
 
           assert(1 == 0);
 
     generates a diagnostic message similar to the following:
 
           Assertion failed: (1 == 0), function main, file assertion.c, line
           100.
  • 打赏
  • 举报
回复
passion_wu128 2013-02-19
assert断言失败会直接退出程序,而if不会。 所以使用assert断言时失败是必须要修改代码的。 而使用if则表明程序在条件为真或假的情况都可以正常运行。
  • 打赏
  • 举报
回复
FingerStyle 2013-02-19
多用assert是个好习惯~
  • 打赏
  • 举报
回复
FingerStyle 2013-02-19
assert的地方 认为应该是永远不会发生的。 如果发生了,assert可以及时debug时提醒去修改 。 为了保证安全 assert之后加if。 但if的地方不一定需要assert。 额。。好像写的有点乱啊
  • 打赏
  • 举报
回复
qq120848369 2013-02-19
简单的说, 当你认为执行到某个位置的时候某个条件应该恒成立, 但你又担心有BUG会导致不成立的时候, 用assert来及时的测试与发现。
  • 打赏
  • 举报
回复
sniffer12345 2013-02-19
引用 2 楼 sdhsfhgfh 的回复:
引用 1 楼 gpshq 的回复:assert即断言,是判断你程序逻辑是否出错。 if是构建一个程序逻辑。 assert(NULL != p);这里指按你的程序逻辑来说这里不可能出现空指针 if(NULL != p)这里指出现这种情况的空指针,你该做什么操作 用法是知道的,疑问是这两个什么时候用?
举个例子吧,比如你要通过一个学生编号获取学生信息,学生信息保存在一个std::map<int,Info*> m_dict中,已知学生编号是大于0并且不超过1000的。 const Info* GetStudentInfo(const int id) const; 你有三种实现选择,第一种使用assert: const Info* GetStudentInfo(const int id) const { assert(id > 0 && id < 1000); assert(m_dict.find(id) != m_dict.end()); return m_dict.at(id); } 第二种使用if: const Info* GetStudentInfo(const int id) const { if(id > 0 && id < 1000); if(m_dict.find(id) != m_dict.end()) return m_dict.at(id); return NULL; } 第三种使用exception。 三种我觉得使用assert最好。因为会让问题能尽早暴露,又不会带来效率和移植上的困扰。
  • 打赏
  • 举报
回复
飞天御剑流 2013-02-19
引用 楼主 sdhsfhgfh 的回复:
编程时候有时用assert判断一个指针是否为空,有时候用if判断,如果不为空再用指针,有没有一些规则何时适合用assert断言,何时适合用if判断。
当NULL在接口规范之外时,应用assert;否则用if。
  • 打赏
  • 举报
回复
Athenacle_ 2013-02-19
assert只有在调试版本下可用。
  • 打赏
  • 举报
回复
无猫皆笼 2013-02-19
assert是为了在开发的时候时刻监视某些条件才用的,是给程序员用的,里面的值如果是false则说明有bug。如果条件可以为false的,也就是false也是正常情况的,那么用if。
  • 打赏
  • 举报
回复
氰客 2013-02-19
int SetFilePath(const char * filePath)
{
	assert(NULL != filePath);//如果强制要使用传入filePath
	
	return 0;
}

int SetFilePath(const char * filePath)
{
	if (NULL == filePath)//如果有默认的filePath
	{
		//set default file path
	}
	else
	{
	}
	return 0;
}
  • 打赏
  • 举报
回复
sdhsfhgfh 2013-02-19
引用 1 楼 gpshq 的回复:
assert即断言,是判断你程序逻辑是否出错。 if是构建一个程序逻辑。 assert(NULL != p);这里指按你的程序逻辑来说这里不可能出现空指针 if(NULL != p)这里指出现这种情况的空指针,你该做什么操作
用法是知道的,疑问是这两个什么时候用?
  • 打赏
  • 举报
回复
氰客 2013-02-19
assert即断言,是判断你程序逻辑是否出错。 if是构建一个程序逻辑。 assert(NULL != p);这里指按你的程序逻辑来说这里不可能出现空指针 if(NULL != p)这里指出现这种情况的空指针,你该做什么操作
  • 打赏
  • 举报
回复
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2013-02-19 02:28
社区公告
暂无公告