int main()
{
int a=5,s;
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}
出力は 7 と 14 です
しかし
int main()
{
int a, s;
printf("Enter value of a");
scanf ("%d",&a);
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}
ユーザーが与える入力は 5 出力は 7 と 13 です
なぜ?
int main()
{
int a=5,s;
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}
出力は 7 と 14 です
しかし
int main()
{
int a, s;
printf("Enter value of a");
scanf ("%d",&a);
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}
ユーザーが与える入力は 5 出力は 7 と 13 です
なぜ?
未定義の動作:
s=++a + ++a;
未定義の場合は何でも発生する可能性があるため、動作は完全に有効です。
これはコンパイラーの最適化のアーティファクトであると思われます。最初の例a
では既知であるため、コンパイラーは追加の前にプリインクリメントを最適化します。2 番目の例では、値が不明であり、コンパイラはシーケンスを最適化せず、左から右に完了します。これは特定のコンパイラの機能である可能性があり、具体的に調べる必要があります。
未定義の動作。変更しないと、猛禽類に襲われる危険があります。
こんにちは、このコーディングは VI コンパイラで正しく機能しています。