インクリメントが絡んでいるので処理を追って説明します.
例として,argv = {"program", "-t10", "-t26"}
とでもしましょう.
**(++argv)
while
文中最初の**(++argv)
ですが,基本的にargv
の第一要素"program"
はプログラム名なので,プログラム名に続いて与えられるであろうオプションを受け取るために,argv
の2番目の要素"-t10"
からチェックします.これが++argv
の役割.
で,argv
の2番目の要素が'-'
で始まっていることを確認するため,文字列の配列であるargv
から具体的な文字列*argv
を取得し,先頭の文字**argv
が'-'
であることをチェックしています.
以上2つを同時に行うのが,if(**(++argv) == '-')
の部分で,具体的に言えば++argv
でargv = {"-t10", "-t26"}
となるので,**(++argv) = '-'
となります.
**(++argv) => **(++({"program", "-t10", "-t26"}))
=> **({"-t10", "-t26"})
=> *("-t10")
=> '-'
*++(*argv)
上記の操作で既にargv
はインクリメントされているので,これ以降argv = {"-t10", "-t26"}
となっていますので,*argv = "-t10"
です.
以降の説明のため一時変数char* tmp = *argv
を置きましょう.
こうすると,tmp = *argv = "-t10"
なので,++tmp = "t10"
となって,*++tmp = 't'
となります.
よって,*++(*argv) = 't'
です.
*++(*argv) => *++(*({"-t10", "-t26"}))
=> *++("-t10")
=> *("t10")
=> 't'
++*argv
さて,先ほどの段で,tmp = *argv
と置きました.
これを定義した時,tmp = *argv = "-t10"
でしたが,その後tmp
は一度インクリメントされたので,現在はtmp = "t10"
となっているはずです.
ここでは,これをさらにインクリメントしているので,++tmp = ++*argv = "10"
となります.
これをatoi
に投げることで,width = 10
が取得できます.
++*argv => ++(tmp)
=> ++("t10")
=> "10"
その後
次のループでは,再びargv
のインクリメントからスタートするので,各部分では
**(++argv) => **(++({"t10", "-t26"})) => **({"-t26"}) => *("-t26") => '-'
*++(*argv) => *++("-t26") => *("t26") => 't'
++*argv => ++("t26") => "26"