3

6 行目で、どのような種類の割り当てスタイルを意味するかを示すサンプルを示しました。

  1 #include<stdio.h>
  2 
  3 int main(int argc,char *argv[])
  4 {
  5         int a,b,c;
  6         c = ({ a=5; b = a+1;});
  7         printf("%d\n%d\n%d\n",a,b,c);
  8         return 0;
  9 }

が何であるか{}わかりません。配列で使用される初期化子リストではありませんint arr[]={1,2,3}


更新: おそらく、このメソッドを使用して、関数で関数を定義したり、gcc (バージョン 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)) でバグを定義したりできます。

  1 #include<stdio.h>
  2 #include<math.h>
  3 int main(int argc,char *argv[])
  4 {
  5         int a,b;
  6         b = ({int cos(i){return 0;};a = 0;cos(a);});
  7         printf("%d\n%d\n",a,b);
  8         b = cos(0);
  9         printf("%d\n%d\n",a,b);
 10         return 0;
 11 }

出力:

0
0
0
1 
4

1 に答える 1

3
({ a=5; b = a+1;})

は GNU 拡張であり、式ステートメントです。標準 C ではありません。

ブロック内のステートメントが実行され、ブロック内の最後の式の値が式ステートメントの値になります。

そう

c = ({ a=5; b = a+1;});

5 に設定aし、次に(6) にb設定し、その値に設定します。a+1c


アップデートにつきましては、

b = ({int cos(i){return 0;};a = 0;cos(a);});

さらに別の GNU 拡張機能、ネストされた関数を使用します。式ステートメントの複合ステートメント内で、ネストされた関数cosが定義され、 でcos宣言された名前を隠します。math.hしたがって、cos(a)複合ステートメントの最後の式である は、ネストされたローカル定義を呼び出します。

8 行目では、ネストされた関数はもちろんスコープ外なので、

b = cos(0);

からの 1 つを呼び出しますmath.h

于 2013-04-13T11:17:48.607 に答える