• 締切済み

インクリメント演算子の前後

インクリメント演算子(++や--)について伺いたいのですが、 以下のような場合、変数の前と後ろで何か処理上違いはあるのでしょうか? //文字列の最後までポインタを進める while ( *p1 ) { ++p1; } printf("%d" , *p++); のように(文法が間違っていたらすいません)、 出力した後でインクリメントするといった使い方の違いは分かるのですが、インクリメント単独処理での前後の違いがあれば教えていただきたいです。

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

> 以下のような場合 とは、 > ++p1; と > *p++ の両方を指していますか? 仮にそうだとすると、 前者の場合、p1++ でも同じです。 後者の場合、書かれたコードでは、*pにアクセスしてからポインターpをインクリメントします。一方、 *++p では、ポインターpをインクリメントしてから*pにアクセスします。 なお、後者の場合、(*p)++ と書くと*pの値をインクリメントします。*p++とは全く意味が異なります。 ご参考までに。

ya-cha
質問者

お礼

ありがとうございました。

noname#88772
noname#88772
回答No.3

こんにちは。 例では同じ結果になりますが、 インクリメントの入った文内で何か操作しようとする場合は違いがでます。 以下のアドレス表示のプログラムを実行すると解ると思いますが。 アドレス移動のタイミングが違います。 即興で作ったので問題あったらご勘弁ください。 #include <stdio.h> int main (void) { int i; char str[11], *p; p=str; for(i=0; i<10; i++ ) { printf( " address(1) : %p\n", ++p); } printf("\n"); p=str; for(i=0; i<10; i++ ) { printf( " address(2) : %p\n", p++); } return 0; }

ya-cha
質問者

お礼

ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

スカラ型であれば、単独で使った場合は、前置でも後置でも同じです。 pが反復子などクラス型の場合は、特別な事情が無い限り前置形式にすべきです。 後置形式にすると、それだけ効率が悪くなりますし、一時オブジェクトの生成時等に例外が送出されるリスクもあります。

ya-cha
質問者

お礼

ありがとうございました。

  • sasuke-
  • ベストアンサー率63% (7/11)
回答No.1

関数内で使用した場合は御存知のように結果が変わってきますが、 単独で使用した場合は動作に違いはありません。 どちらを書くかは、その人の好みです。

ya-cha
質問者

お礼

ありがとうございました。

関連するQ&A

  • インクリメント演算子について

    インクリメント演算子について プログラミング超初心者です。 大学のプログラミングの課題で インクリメント演算子を使って 数字をひとつずつ大きく(小さく)していくという課題が出ました 私が作ったプログラムは以下のとおりです #include <stdio.h> int main(void) { int x ; //変数宣言 printf("整数値を入力してください:"); scanf("%d",&x); printf("1ずつ増加\n"); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d\n",x); printf("1ずつ減少\n"); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d\n",x--); } ちなみに、整数値は10にしました。 結果は 1ずつ増加 10,11,12,13,14 1ずつ減少 14,13,12,11,10 と、望んでるものになったのですが、疑問があるので質問させていただきます。 xを変数にすると、x++はx+1になると思うのですが表示されたのは10、11、…と 10から表示されました。 しかも、増加していった最後のxはなぜ14になるのでしょうか? 課題は出来たのですが、頭が混乱しています… 詳しく解説をお願いします。

  • インクリメント演算子

    はじめまして。プログラミングについて、とても初歩的な所で つまづいています。 変数を一つだけかつ、インクリメント演算子のみを用いて 整数値を一つ入力し,その整数値を1ずつ増やした結果を出す 4,5,6,7,8  (←このようにしたい) というプログラミングを書きたいのですが、どこのサイトを見ても 5個の文字の例はありませんでした。 2個までは以下の例でできました。 #include <stdio.h> main() { int a; printf("整数値を入力"); scanf("%d",&a); printf("1ずつ増加%d,%d,\n",a++,a); } もう、この問題で何日も立ち止まっています。 お願いです、どなたか助けてください。

  • インクリメント/デクリメント演算子を使った計算

    Javaでのインクリメント演算子とデクリメント演算子を 使った計算についての質問です。 int a = 10; int b = a++ + ++a + --a - a--; このコード処理後の変数a,bの値の計算方法(考え方)が つかめず苦戦しています。 解答はa=10,b=22だそうです。 ちなみに例えば次のコードのb=a++;のように 右辺と左辺が1つずつの場合は理解しやすいです。 int a = 1; int b = 0; b = a++; //処理A 処理A後の変数a,bの値は b=aをした後でa=a+1を行うので a=2,b=1 となることは理解できます。 ご教授のほどよろしくお願いします。

  • new演算子とインクリメント

    #include <iostream.h> main(){ char *str = new char[10]; memset(str, 0, 10); char *p = str; *p = 1; printf("%x", *p); delete [] str; } これで0が出力されるけど、*p = 1; を *p += 1; にすると *p += 1; の部分の実行時にエラーでフリーズしました。 この場合、*p += 1; と書いてはだめなのですか? *p = 1; との違いがあれば教えてください。

  • インクリメント演算子をprintf文で使うことについて

    ◎1-------------------------------------- #include<stdio.h> int main(void) { int i=0; while(i<=20){ printf("%d\t%d\t%d\t%d\t%d\n",++i,++i,++i,++i,++i); } return 0; } ------------------------------------------ ◎2-------------------------------------- #include<stdio.h> int main(void) { int i=0; while(i<=20){ printf("%d\t%d\t%d\t%d\t%d\n",i++,i++,i++,i++,i++); } return 0; } ------------------------------------------ 以上2つのプログラムについて疑問があるのですが、まず◎1についてですが、実行結果は、 5    4   3   2   1 10   9   8   7   6 15   14   13   12   11 20   19   18   17   16 25   24   23   22   21 以上のようになるのですが、自分の考えでは、「printf("%d\t%d\t%d\t%d\t%d\n",i++,i++,i++,i++,i++);」部分の、一番最初の「++i」から処理が始まり、 1  2  3  4  5      ・      ・      ・ のようになる事を期待したのですが、一番最後の「++i」から処理が始まってしまいました。 次に、◎2についてですが実行結果は、 0   0   0   0   0 5   5   5   5   5 10  10  10  10  10 15  15  15  15  15 20  20  20  20  20 以上のようになりました。「printf("%d\t%d\t%d\t%d\t%d\n",i++,i++,i++,i++,i++);」部分で、iをいったん表示してから、iに1を加算するということで、次のiは1になっており、 4  3  2  1  0      ・      ・      ・ のようにまた一番最後の「i++」から処理され以上のようになると思ったのですが、そうはなりませんでした。 以上、◎1と◎2について何故こうなるのかご回答いただければ嬉しいです。

  • for文の;で区切られる3つの要素は文扱いになるのですか?

    すみません。昨日、某巨大掲示板で質問したのですが、アクセス規制喰らったので。。ここで聞かせてください。C言語を色々と実験中の者です。 int a[]={1,2,3,0}, *p=a-1; for(;*p++;){ // 何らかの処理 } とすると、*pが終了条件に当てはまってないか確認されてからp++されるということをしりました。 これは printf("%d", *p++); の一文がまず*pの値が(インクリメントする前の値が)%dに代入され表示されて、そのあとにp++でインクリメントされるのと似ています。というか、動作は一緒です。これは、後置インクリメント演算子は、その一文が評価されてから、インクリメントされるということですが。 そうすると前述のfor(;*p++;)のp++;の部分も文と考えれらるような気がするのですが。。;で区切られていますし、やはり文法的に言うと文になるのでしょうか? マルチになるのかもしれませんが、よろしくお願いします。某巨大掲示板をプロバイダ規制喰らったので。。

  • ポインタの文法

    現在自分が勉強している中で、ポインタを宣言値を出力するときの文法は「pa」がポインタだとすると、 int *pa , printf("%p\n",pa) , printf("%d\n",*pa) などですが、sizeof(pa*)は後ろに「*」がついており後ろに「*」がつくときの意味が分かりません。 是非ご教示願います。

  • インクリメントしてくれません

    配列mousの各要素を配列tousと照らし合わせ、マッチしたら変数countにインクリメントし、何回マッチングしたかを返す関数を作りました。 でも、なぜか1回しかインクリメントしてくれません。 確認のため試しにcount++部分をputf("テスト表示")に置き換えた場合マッチングした回数だけ「テスト表示」表示されました。 じゃあなぜ、変数countは一回しかインクリメントされないのでしょうか? #include <stdio.h> int DataMatch(int *, int *); void main() { int mous[6] = { 1, 15, 12, 23, 33, 42}; int tous[7] = {10, 15, 19, 23, 33, 42, 11}; int test; test = DataMatch(mous, tous); printf("%d%\n", test); } ////////////////////////////////////////////////// int DataMatch(int *buffer1, int *buffer2) { int i, j, count; for(i = 0; i < 6 ; i++ ){ for(count = 0, j = 0; j < 6; j++){ if(buffer1[i] == buffer2[j]){ count++;//インクリメントしてくれない! break; } } } return count; }

  • ポインタに関する質問

    int v; int *p=&v ポインタ変数pに変数vのアドレスを代入して、次からは、pからvの値を操作したいのですが、「*p++」としたところ、変数vの値がインクリメントされずに、pに格納されるアドレスその物がインクリメントされてしまいました 「*p+=1」とする事でvの値をインクリメントすることができましたが、 「*p+=1」このように書かれる処理は望ましい物ではないのでしょうか

  • インクリメント++の計算

    インクリメントの前置きと後置きの計算の考え方がいまいち飲み込めないですが 例:int a=5 , w; w=++a + a++;   printf("w=%d. a=%d",w,a); このときのwの値とaの値は? (一応試してみたらw=12 a=7になりましたがなぜでしょう?)