5

私はちょうどいくつかの C を学んでいます。というか、難解な詳細のいくつかの感覚を得ています。そして、私は VTC の高度な C プログラミングを使用していましたが、そのシーケンス ポイントは次のとおりです。

  • セミコロン
  • コンマ
  • 論理和/論理積
  • 三項演算子
  • 関数呼び出し (関数呼び出しの引数として使用される式は、呼び出しが行われるとファイナライズされます)

これらはすべて正しいですか?私が試した最後のものについて:

void foo (int bar) { printf("I received %d\n", bar); }

int main(void) 
{

  int i = 0;

  foo(i++);

  return 0;

}

そして、それは 1 を出力しませんでした。VTC の担当者が言ったことによると、私が正しく理解していれば、そうなるはずですよね?. また、関数呼び出しのこれらのかっこは、グループ化のかっこと同じですか? (つまり、それらの優先順位)。括弧の優先順位が ++ よりも高いためかもしれませんが、 foo((i++)); も試しました。そして同じ結果を得ました。foo(i = i + 1); のみを実行します。1をもたらしました。

前もって感謝します。私は南アメリカ出身だと考えてください。私が明確でなかったり、何も意味をなさない場合は、教えてください。

よろしくお願いします、セバスチャン。

4

4 に答える 4

4

シーケンス手段i++は、呼び出される前に評価fooされます。

このケースを考えてみましょう (私は印刷していませんbar! ):

int i = 0;
void foo (int bar) { printf("i = %d\n", i); }
int main(void){
    foo(i++);
    return 0;
}

i = 1印刷する必要があります。

于 2013-07-04T06:06:53.640 に答える
3

C は、値渡しセマンティクスを実装しています。最初i ++に が評価され、値が保持され、次にi変更されます (これは、評価と次のシーケンス ポイントの間の任意の時点で発生する可能性があります)。次に、バックアップ値を引数として関数に入力します。

関数に渡される値は、引数式を他の方法で使用した場合に表示される値と常に同じです。他の動作はかなり驚くべきものであり、一般的な部分式を関数にリファクタリングすることを困難にします。

于 2013-07-04T06:03:35.843 に答える
1

次のような場合: int i = 0, j;

j = i++;

i の値が最初に使用され、次にインクリメントされます。したがって、あなたの場合、0であるiの値が使用され(したがって、関数fooに渡されます)、インクリメントされます。i のインクリメントされた値 (現在は 1) は、ローカル変数であるため、main でのみ使用できます。

1 を出力したい場合は、次のように foo を呼び出します。

フー(++i);

これにより、1が出力されます。

于 2013-07-04T09:17:03.713 に答える