代码之家  ›  专栏  ›  技术社区  ›  lvella

这个代码有效吗?[已关闭]

c99 c
  •  -4
  • lvella  · 技术社区  · 8 年前

    出于兼容性原因,我想定义一个迭代器宏,其工作方式如下:

    elem_type *ptr;
    ITERATE(&container, ptr) {
        // This will loop through every element of the container
        // ptr will point to the current element.
    }
    

    我有一个必须用函数调用初始化的迭代器类型,其工作原理如下:

    iter_type iter;
    iter_init(&container, &iter);
    while((ptr = iter_next(&iter))) {
        // ...
    }
    

    #define ITERATE(container_ptr,elem_ptr) \
        for(iter_type _iter = ( \
            iter_init(container_ptr, &_iter), _iter); \
            (elem_ptr = iter_next(&_iterator));)
    

    因此,正如您所看到的,逗号运算符有一个小技巧,以便在 for 。此代码是否有效C99,并且始终有效?

    1 回复  |  直到 8 年前
        1
  •  1
  •   P.P    8 年前

    是的,它是有效的,并且永远有效。

    只需执行for循环,

        for(iter_type _iter = (iter_init(container_ptr, &_iter), _iter); \
            (elem_ptr = iter_next(&_iterator));)
    

    尤其是 初始化子句 iter_type _iter = (iter_init(container_ptr, &_iter), _iter) ,您可以看到这里涉及逗号运算符。

    这个 逗号运算符 总是从左到右求值,每个操作数之间都有一个序列。