与えられたプログラムは適切に定義されていますか?
#include <stdio.h>
int main()
{
int a=2,*f1,*f2;
f1=f2=&a;
*f2+=*f2+=a+=2.5;
*f1+=*f1+=a+=2.5;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
与えられたプログラムは適切に定義されていますか?
#include <stdio.h>
int main()
{
int a=2,*f1,*f2;
f1=f2=&a;
*f2+=*f2+=a+=2.5;
*f1+=*f1+=a+=2.5;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
いいえ。 のビット*f2 += *f2 += ...
は既に未定義の動作です。間にシーケンス ポイントがない、同じオブジェクトの複数の変更。さらに見る必要はありません。
編集- 括弧が操作の順序を制御すると言ったとき、私は完全に間違っていました。AndreyT は私を正してくれました。私が投稿した元のコードにも未定義の動作がありました。これは私の2回目の試みです。私の元の投稿もこの下にあるので、修正が見られます。
変数宣言を複数の行に分割して、何が起こっているかを確認することをお勧めします。
// このコードはポインタを使った実験です
#include<stdio.h>
int main()
{
int a=2; //initialize a to 2
int *f1;
int *f2;
f1 = &a; //f1 points to a
f2 = &a; //f2 points to a
a += 2.5;
*f1 += a;
*f1 += a;
*f2 += a;
*f2 += a;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
結果プリント 64 64 64
// 私の以前の間違ったコードは以下のとおりです:
#含む
int main()
{
int a=2; //initialize a to 2
int *f1;
int *f2;
f1 = &a; //f1 points to a
f2 = &a; //f2 points to a
a += 2.5; //2.5 + 2 = 4.5, but 4.5 as an int is 4.
*f1 += (*f1 += a); //4 + 4 = 8. 8 + 8 = 16.
*f2 += (*f2 += a); //16 + 16 = 32. 32 + 32 = 64.
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
結果プリント 64 64 64
かっこを使用して、どの操作が最初に発生するかを保証する必要があります。お役に立てれば。最初。お役に立てれば。