【问题标题】:Suggestions for concise index handling in circular buffer循环缓冲区中简洁索引处理的建议
【发布时间】:2010-10-07 13:55:10
【问题描述】:

我已经实现了一个循环缓冲区,我想要一种简洁的方法来更新缓冲区指针,同时正确处理环绕。

假设数组大小为 10,我的第一反应是这样的:

size_t ptr = 0;  
// do some work...
p = ++p % 10;

静态分析以及 gcc -Wall -Wextra 正确地拍打了我的手腕,因为违反了序列点的行为。明显的解决方法是:

p++;
p %= 10;

但是,我一直在寻找更简洁的东西(即单线)来“封装​​”这个操作。建议?除了p++; p%= 10; :-)

【问题讨论】:

    标签: c c99 sequence-points


    【解决方案1】:
    p = (p + 1) % N;
    

    或避免取模:

    p = ((N-1) == p) ? 0 : (p+1);
    

    【讨论】:

    • 呵呵,“p = (p + 1) % N”是这样的。
    【解决方案2】:

    与p++; p%=10; 不同,我相信在p++, p%=10; 中使用逗号运算符更适合作为“单行”。您可以在宏或循环体或不带大括号的 if/else 语句中使用它,它的计算结果为 p。

    【讨论】:

      【解决方案3】:

      你考虑过++p %= 10;

      【讨论】:

      • ++p 在C 中不可修改。不知道C++ 或Java(问题未使用这些语言标记)
      • 对了。我刚刚检查过,它在 C 中是不可修改的。另一个我在语言之间的差异中被绊倒的地方。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多