2

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

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

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

静态分析以及gcc -Wall -Wextra正确地拍打了我的手腕,因为由于序列点违规而导致的未指定行为。明显的修复是这样的:

p++;
p %= 10;

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

4

3 回答 3

7
p = (p + 1) % N;

或避免模:

p = ((N-1) == p) ? 0 : (p+1);
于 2010-10-07T13:57:50.253 回答
0

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

于 2010-10-07T16:11:21.580 回答
-2

你有没有考虑过++p %= 10;

于 2010-10-07T14:26:47.767 回答