• ベストアンサー

ポインタについて

こんにちは。「独習C」で独学している者です。その中の練習問題をやっていました。課題はコマンドラインから引数を受け取り各文字に1を加え暗号化して表示するというものでした。 自分で考え一応ちゃんと動くものが書けました。その後もっとシンプルにならないかと少しずつ余分な所を削っていき以下のようになりました。 #include <stdio.h> int main(int argc,char *argv[]) { char ch; if(argc != 2){ printf("引数が正しくありません"); exit(1); } else while(*argv[1] != '\0'){ printf("%c",*(argv[1]++) + 1); } return 0; } できた、できたと喜んでいたのですがソースをよく見ていると*(argc[1]++)の所を見てあれっと思いました。これでは文字列の二番目の要素からしか表示できないのではないのかと思ったのです。しかし動かすとちゃんと動くのです。ちゃんと1番目の要素も表示されるのです。自分としては++を消して次の行にargv[1]++を付け加えればいいと思ったのですがどうでしょうか?(←これでもちゃんと動きました)私のポインタに対する考え方が間違っているのでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

これじゃないでしょうか? 【インクリメント演算子、デクリメント演算子】 この演算子は、「i++」のように変数の後に書くことも、「++i」のように変数の前に書くこともできます。 しかし「j = i++」のように式の中に組み込むと、変数の前に書いた場合と、変数の後に書いた場合の動作が異なります。 変数の前に書いた場合は、式を評価する前にインクリメントします。逆に 変数の後に書いた場合は、式を評価した後にインクリメントします。 i = 0; a = i++; /* ← この時点でaは0、iは1 */ i = 0; a = ++i; /* ← この時点でaは1、iは1 */

参考URL:
http://www5c.biglobe.ne.jp/~ecb/c/05_02.html
aleck
質問者

お礼

回答ありがとうございます。 インクリメント、デクリメント演算子については理解していたつもりでしたが、理解が足りなかったようです。()で囲むことで先に増減されるものと勘違いしていたようです。ありがとうございました。

その他の回答 (3)

回答No.4

#3です。早とちりの勘違いでした。すみません。

aleck
質問者

お礼

いえいえ、ありがとうございます。 またよろしくお願いします。

回答No.3

*argv[0]は起動したプログラム名が入る仕様です。 最近はどのコンパイラもそうなっているとのことです。

  • yy_y
  • ベストアンサー率39% (99/252)
回答No.2

++argv[1] としてしまうと,先にインクリメントするので次の要素からになってしまいますが, argv[1]++ とする分には,先に前の作業が実行されてからインクリメントするので問題ありません.

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec03.html
aleck
質問者

お礼

回答ありがとうございます。 下の方のお礼の中でも書かせていただきましたが、理解が足りなかったようですね。後置の場合は()で囲まれてようがなかろうがその行の演算が終了してから増減されるのですね。ありがとうございました。