今天范了个很小的错误,导致从队列中获取的值不正确,排查了很长时间才找到错误原因.
为吸取教训,现记录如下:
1 错误的代码
item = arg->queue.queues[++arg->queue.tail];
平常写for(int i =0; i < 100;++i)习惯了,所以获取队列值时也顺手写成++arg->queue.tail.
2 正确的代码
item = arg->queue.queues[arg->queue.tail++];
3 注意事项
演示代码
/*
* array[++index] ++在前表示先index = index+1,然后再从数组index的位置获取值
* array[index++] ++在后表示先从数组index的位置获取值,然后再index = index+1
* i=1; y=i++; 等效于:i=1; y=i; i=i+1; 则执行完后 y=1; i=2;
* i=1; y=++i; 等效于:i=1; i=i+1; y=i; 则执行完后 y=2; i=2;
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
int queues[4] = {1,2,3,4};
int index=0;
//假设期望获取的值为1,也就是queues[0]的值,
//正确的用法,打印的值为1
fprintf(stdout,"%d\n",queues[index++]);
//错误的用法,打印的值为2
index=0;
fprintf(stdout,"%d\n",queues[++index]);
return (EXIT_SUCCESS);
}
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int n = 0, i = 0;
fprintf(stdout, "%d\n", n = i++);
fprintf(stdout, "%d\n", n = ++i);
fprintf(stdout, "%d\n", i++);
fprintf(stdout, "%d\n", i);
return (EXIT_SUCCESS);
}
/*
0
2
2
3
*/
4 使用技巧
根据这一特性,我们可以在c++中使用这一技巧删除容器中的元素(在我早期的博文中使用过).
#include <iostream>
#include <set>
int main(int argc, char** argv) {
std::set<int> container;
container.insert(1);
container.insert(2);
container.insert(3);
container.insert(4);
container.insert(5);
container.insert(6);
for (std::set<int>::iterator it = container.begin(); it != container.end();) {
if (3 == (*it)) {
/*
* 删除项值为3的元素
* 根据3节说明的特性,先执行了erase(it)方法,然后再执行 it = it +1
*/
container.erase(it++);/* Really smart! */
} else {
++it;
}
}
//如不改变容器的内容请使用const_iterator
for (std::set<int>::const_iterator it = container.begin(); it != container.end();++it)
std::cout << *it << std::endl;
return 0;
}