Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三元运算符作为C宏中三元运算符的操作数_C_Macros_Ternary Operator - Fatal编程技术网

三元运算符作为C宏中三元运算符的操作数

三元运算符作为C宏中三元运算符的操作数,c,macros,ternary-operator,C,Macros,Ternary Operator,我正试图实现Erathostenes的筛选,以获取无符号长数组的素数位,因此我编写了一个宏来检查某些位的值。。(函数会更简单,但它是学校的一个指令,所以它必须是宏)我需要测试索引是否在位的范围内,所以有函数调用FatalError,这是带有exit(1)调用的无效函数,所以逗号运算符使整个宏可能在条件内 #define GetBit(array_name, index) \ (((index) < (array_name)[0]) && ((index) >= 0

我正试图实现Erathostenes的筛选,以获取
无符号长
数组的素数位,因此我编写了一个宏来检查某些位的值。。(函数会更简单,但它是学校的一个指令,所以它必须是宏)我需要测试索引是否在位的范围内,所以有函数调用
FatalError
,这是带有
exit(1)
调用的无效函数,所以逗号运算符使整个宏可能在条件内

#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)
数组\u name[0]
上,有以位为单位的数组大小

所以我的问题是,即使是第一个索引也不能通过范围检查,筛选从索引2开始,程序立即以索引2结束

~ $ gcc primes.c fatalerror.c -pedantic -Wall -g -std=c99 -lm; ./a.out
FATAL ERROR: Index 2 out of range 0..1000
~ $ 

显然有一个bug,所以忽略“正确”的答案形式,让自己更容易找到bug。如果你走一条比较容易的路线,找到问题的速度可能会更快。只要您试图坚持使用单个宏,调试就可能会更加困难

具体地说,我将把宏变成一个函数,使其更易于调试,然后将表达式分解为多个组件,并添加大量打印语句以更好地了解正在发生的事情:

printf("(((index) < (array_name)[0]) && ((index) >= 0)) = %d\n", 
        (((index) < (array_name)[0]) && ((index) >= 0)));
printf("(array_name)[((index) / BYTE) + 1] = %d\n", 
        (array_name)[((index) / BYTE) + 1]);
printf("( (unsigned long)1 << ((index) % BYTE)) = %d\n", 
        ( (unsigned long)1 << ((index) % BYTE)));
printf("BYTE=%d\n", BYTE);

// etc.

显然有一个bug,所以忽略“正确”的答案形式,让自己更容易找到bug。如果你走一条比较容易的路线,找到问题的速度可能会更快。只要您试图坚持使用单个宏,调试就可能会更加困难

具体地说,我将把宏变成一个函数,使其更易于调试,然后将表达式分解为多个组件,并添加大量打印语句以更好地了解正在发生的事情:

printf("(((index) < (array_name)[0]) && ((index) >= 0)) = %d\n", 
        (((index) < (array_name)[0]) && ((index) >= 0)));
printf("(array_name)[((index) / BYTE) + 1] = %d\n", 
        (array_name)[((index) / BYTE) + 1]);
printf("( (unsigned long)1 << ((index) % BYTE)) = %d\n", 
        ( (unsigned long)1 << ((index) % BYTE)));
printf("BYTE=%d\n", BYTE);

// etc.

看来问题出在埃拉托内斯的功能上

if( ! GetBit(pole, m) )
宏当然扩展为

!(range check) ? op1 : op2
所以这个条件被否定了

我删除了感叹号并切换了
op1的返回操作数

((shift, and) ? 0 : 1)
乍一看,这些值似乎有点不合逻辑,但效果很好


感谢大家抽出时间

看来问题出在

if( ! GetBit(pole, m) )
宏当然扩展为

!(range check) ? op1 : op2
所以这个条件被否定了

我删除了感叹号并切换了
op1的返回操作数

((shift, and) ? 0 : 1)
乍一看,这些值似乎有点不合逻辑,但效果很好


感谢大家为您付出的时间

FatalError
是一个
void()
?所以你在调用类似于
条件的东西?1:void()我很惊讶它居然可以编译。这就是逗号运算符的作用,条件为0(但不是因为
FatalError
中的
exit
),我还需要查看完整的源代码。我把它放在一个C程序中,但我所做的只是工作。。提供更多代码。。。只有fatalerror在那里丢失
fatalerror
void()
?所以你在调用类似于
条件的东西?1:void()我很惊讶它居然可以编译。这就是逗号运算符的作用,条件为0(但不是因为
FatalError
中的
exit
),我还需要查看完整的源代码。我把它放在一个C程序中,但我所做的只是工作。。提供更多代码。。。那里只有致命的错误