C言語++iとi++

13066 ワード

今日は小さなエラーが発生し、キューから取得した値が正しくないため、エラーの原因が見つかるまで長い間調べられました.教訓を吸収するために、以下のように記録します.
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 
#include 
int main() {
	int queues[4] = {1,2,3,4};
	int index=0;
	//         1,   queues[0]  ,
	//     ,     1
	fprintf(stdout,"%d
"
,queues[index++]); // , 2 index=0; fprintf(stdout,"%d
"
,queues[++index]); return (EXIT_SUCCESS); }
#include 
#include 
int main(int argc, char** argv) {
    int n = 0, i = 0;
    fprintf(stdout, "%d
"
, n = i++); fprintf(stdout, "%d
"
, n = ++i); fprintf(stdout, "%d
"
, i++); fprintf(stdout, "%d
"
, i); return (EXIT_SUCCESS); } /* 0 2 2 3 */

4テクニック
この特性に基づいて、c++でこのテクニックを使用して容器の要素を削除することができます(私の初期のブログで使用したことがあります).

#include 
#include 
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;
}