0

次の両方のコードを実行するにはどうすればよいですか (コードは 2 行目のセミコロンを除いて同じです)

このコードは実行されることが想定されており、同様に実行されます。

#include<stdio.h>
#define SWAP(a, b) int t; t=a, a=b, b=t  //note here is no semi-colon at the end
int main()
{
    int a=10, b=12;
    SWAP(a, b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

しかし、次のように実行されることは期待されていませんSWAP(a, b).したがって、 int t; t=a, a=b, b=t;;2 つのセミコロンはエラーを生成するはずです!!!

#include<stdio.h>
#define SWAP(a, b) int t; t=a, a=b, b=t;  //note the semi-colon here
int main()
{
    int a=10, b=12;
    SWAP(a, b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
4

4 に答える 4

7

迷子のセミコロンは、C では完全に正当な null ステートメントになります。

コードに 12 個のセミコロンを含む行を追加することで、これを証明できます。

これとは別に、マクロは次のように記述したほうがよいでしょう。

#define SWAP(a, b) do { int t = a; a = b; b = t; } while (0)

これは、1 つのコード ブロックで 2 つの異なるスワップを実行しようとするとうまく機能します。

于 2013-09-20T18:13:52.617 に答える
4

ローカル スコープの余分なセミコロンは、マクロのように使用された場合、C (C99 以降) でエラーを生成することはありません。それらは単に空のステートメントを導入します。それがエラーであるべきだという考えはどこから得たのですか?たとえば、余分なセミコロンが原因で「orphaned else」エラーが発生するような例を作成することはできますが、いずれにしてもマクロは使用できませifん (以下を参照)。

C89/90 では、宣言とステートメントを混在させることは違法であったため、宣言の後に誤って余分なセミコロンを配置することでエラーを引き起こす可能性がありました。例えば

int a, b;;  /* <- A declaration followed by an empty statement */
int c;      /* <- ERROR: Illegal declaration after a statement */

しかし、C99 では、宣言とステートメントを混在させることができるため、これは問題ではありません。あなたSWAPは明らかにC99用に実装されているので、この問題はすぐには当てはまりません。

SWAPこのような の実装は非常に貧弱であり、非常に危険であることは注目に値します。次のような状況では、予期せぬ、危険な、まったく意味のない動作につながる可能性があります。

if (/* whatever */)
  SWAP(a, b);

do/while(0)イディオムに従って、次のようなことを行う方がよい

#define SWAP(a, b) do { int t; t=a, a=b, b=t; } while (0)

注 - 最後にセミコロンはありません。

于 2013-09-20T18:16:29.677 に答える