我试图实现Erathostenes的筛子来获得unsigned long
数组的一个主要位,所以我写了一个宏来检查某个位的值。(函数会更容易但它是学校排序,所以它必须是宏)我需要测试索引是否在位的范围内,所以有函数调用FatalError
,这是void函数与调用exit(1)
,所以逗号运算符使整个宏可能是条件的内部三元运算符作为C宏中三元运算符的操作数
#define GetBit(array_name, index) \
(((index) < (array_name)[0]) && ((index) >= 0)) ? \
(((array_name)[((index)/BYTE) + 1] & ((unsigned long)1 << \
((index) % BYTE))) ? 1 : 0) : \
(FatalError("Index %ld out of range 0..%ld\n", (long)(index), \
(long)(array_name)[0]), 0)
更可读的形式:
#define GetBit(array_name, index) \
(range check) ? \
((bit shift, and) ? 1 : 0) : \
(function call, 0)
在array_name[0]
上,数组的大小以位为单位。
所以我的问题是,甚至不是第一个索引可以通过范围检查得到,筛开始与指数2,程序立即结束与
~ $ gcc primes.c fatalerror.c -pedantic -Wall -g -std=c99 -lm; ./a.out
FATAL ERROR: Index 2 out of range 0..1000
~ $
'FatalError'是一个'void()'?所以你打电话像'条件? 1:void();'我很惊讶,甚至编译。 – 2012-03-17 10:50:02
源代码。 – blueshift 2012-03-17 10:51:20
这就是逗号运算符的意思,条件变为0(但它并不是因为'FatalError'中的'exit') – rivfaader 2012-03-17 10:54:01