我已经实现了一个循环缓冲区,我想要一个简洁的方法来更新缓冲区指针,同时正确处理环绕。
假设一个大小为10的数组,我的第一个响应是:
size_t ptr = 0;
// do some work...
p = ++p % 10;
静态分析,以及 gcc -Wall -Wextra ,由于序列点违规而正确地拍了我的手腕以查找未指定的行为。明显的解决方法是:
p++;
p %= 10;
然而,我正在寻找更简洁的东西(即单行)以“封装”此操作。建议?除了 p ++; p%= 10; : - )
答案 0 :(得分:7)
p = (p + 1) % N;
或避免使用模数:
p = ((N-1) == p) ? 0 : (p+1);
答案 1 :(得分:0)
与p++; p%=10;
不同,我认为在p++, p%=10;
中使用逗号运算符更适合作为“单行”。您可以在宏或循环体中使用它,或者在没有大括号的if / else语句中使用它,并计算结果值p
。
答案 2 :(得分:-2)
您是否考虑过++p %= 10;