assert.h问题

来源:互联网 发布:淘宝客服用语技巧 编辑:程序博客网 时间:2024/05/29 19:35

NVIDIA面试笔试题之一:

assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义。

assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。

该宏可以屏蔽掉,只需在包含assert.h之前#define NDEBUG,想开再#undef。从这里可以看出预处理带来的方便。

函数名: assert

  功 能: 测试一个条件并可能使程序终止

  用 法: void assert(int test);

  程序例:

  #include <assert.h>

  #include <stdio.h>

  #include <stdlib.h>

  struct ITEM {

  int key;

  int value;

  };

  

  void additem(struct ITEM *itemptr) {

  assert(itemptr != NULL);

  

  }

  int main(void)

  {

  additem(NULL);

  return 0;

  }

  assert() 函数用法

  assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

  #include <assert.h>

  void assert( int expression );

  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,

  然后通过调用 abort 来终止程序运行。

  请看下面的程序清单badptr.c:

  #include <stdio.h>

  #include <assert.h>

  #include <stdlib.h>

  int main( void )

  {

  FILE *fp;

  fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件

  assert( fp ); //所以这里不会出错

  fclose( fp );

  fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败

  assert( fp ); //所以这里出错

  fclose( fp ); //程序永远都执行不到这里来

  return 0;

  }

  [root@localhost error_process]# gcc badptr.c

  [root@localhost error_process]# ./a.out

  a.out: badptr.c:14: main: Assertion `fp' failed.

  已放弃

  使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

  在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

  #include <stdio.h>

  #define NDEBUG

  #include <assert.h>

  用法总结与注意事项:

  1)在函数开始处检验传入参数的合法性

  如:

  int resetBufferSize(int nNewSize)

  {

  //功能:改变缓冲区大小,

  //参数:nNewSize 缓冲区新长度

  //返回值:缓冲区当前长度

  //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区

  assert(nNewSize >= 0);

  assert(nNewSize <= MAX_BUFFER_SIZE);

  ...

  }

  2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

  不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

  好: assert(nOffset >= 0);

  assert(nOffset+nSize <= m_nInfomationSize);

  3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

  错误: assert(i++ < 100)

  这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

  正确: assert(i < 100)

  i++;

  4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

  5)有的地方,assert不能代替条件过滤

  注意:当对于浮点数:

  #include<assert.h>

  // float pi=3.14;

  // assert(pi=3.14); //

  float pi=3.14f;

  assert (pi=3.14f);

  ---------------------------------------------------------

  在switch语句中总是要有default子句来显示信息(Assert)。

  int number = SomeMethod();

  switch(number)

  {

  case 1:

  Trace.WriteLine("Case 1:");

  break;

  case 2:

  Trace.WriteLine("Case 2:");

  break;

  default :

  Debug.Assert(false);

  break;

  }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 厨房做了防水漏怎么办 手表防水膏多了怎么办 单反镜头有指纹怎么办 手机解锁键坏了怎么办 lv包肩带胶熔了怎么办 手机膜进空气了怎么办 铁的下水管漏水怎么办 刚浇的水泥开裂怎么办 马桶移位器堵了怎么办 分散片直接吃了怎么办 坐马桶拉不出来怎么办 泥状面膜干了怎么办 苹果6s掉水里了怎么办 手机充电口松了怎么办 手机液体膜碎了怎么办 车膜贴的太黑了怎么办 苹果7后壳氧化怎么办 苹果6s后盖氧化怎么办 苹果6s后壳氧化怎么办 食道癌吃了就吐怎么办 有眼袋和泪沟怎么办? 泪沟和眼袋都有怎么办 脸上的汗毛很长怎么办 点痣留下褐色印怎么办 氮氧传感器坏了怎么办 考试车离合太松怎么办 胎心监护不过关怎么办 羚羊角的功效与作用发烧怎么办 小孩上课注意力不集中怎么办 2岁宝宝不会说话怎么办 小孩脖子上长淋巴结怎么办 小孩子上课注意力不集中该怎么办 脸过敏干燥起皮怎么办 脸上皮肤干燥起皮怎么办 身上皮肤干燥起皮怎么办 皮肤暗黄有色斑怎么办 我皮肤干燥暗黄怎么办 脸上有皮肤暗黄怎么办 皮肤暗黄毛孔大怎么办 脸上很干燥起皮怎么办 脸上的皮肤起皮怎么办