intmain(int argc, charconst *argv[]) { double x, y, z; puts("Enter a pair of numbers(0 0 to quit): "); while (scanf("%lf%lf", &x, &y) == 2 && (x != 0 || y!= 0)) { z = x * x - y * y; // 原本应为 z = x * x + y * y assert(z >= 0); printf("answer is %f\n", sqrt(z)); puts("Next pair of numbers: "); } puts("Done!"); return0; }
执行结果:
可以看到当z >= 0的结果不成立时,程序会报出错误所在的行及其原因,并终止程序。
编程规范
断言必须使用宏定义,禁止直接调用系统提供的assert()
断言只能在调试版本中使用,在正式发布版本中严禁使用断言,因为断言一旦被触发,程序就会立即退出。
错误用法:
1 2 3 4 5
intFoo(int *array, int size) { assert(array != NULL); ... }
/* Generate a CRC-16 by looking up the transformation in a table and ** XOR-ing it into the CRC, one byte at a time. ** ** Note: complement the seed to account for it having been complemented ** in a previous call to crc_16_step(). */ for (crc_16 = ~seed ; byte_len > 0; byte_len--, buf_ptr++) { crc_16 = (word)(crc16_table[ (crc_16 >> (16 - 8)) ^ *buf_ptr ] ^ (crc_16 << 8)); }
return( ~crc_16 ); /* return the 1's complement of the CRC */