0

この小さなコードを試して、IFステートメントで複合リテラルを使用しました。

#include<stdio.h>

struct time
{
    int hour;
    int minutes;
    int seconds;
};

int main(void)
{
    struct time testTimes;
    testTimes = (struct time){12,23,34};

    if (testTimes == (struct time){12,23,34})
        printf("%.2i:%.2i:%.2i\n", testTimes.hour, testTimes.minutes, testTimes.seconds);
    else
        printf("try again !\n");
    return 0;
}

うまくいきませんでした。コンパイル時に次のメッセージが表示されました。

prac.c:15:16:エラー:バイナリへのオペランドが無効です==(「構造体時間」と「構造体時間」があります)

IFステートメントで複合リテラルを使用することは許可されていませんか、または構文が正しくありませんか?

4

4 に答える 4

3

を使用して構造体を比較することはできません==

構造体の各メンバーを個別に比較する必要があります。

于 2012-05-09T07:35:33.213 に答える
3

==演算子を使用して構造を比較できないのには十分な理由があります

CFAQからの引用

コンパイラが構造体の比較を実装する(つまり、構造体の==演算子をサポートする)ための良い方法はありません。これは、Cの低レベルのフレーバーと一致しています。単純なバイトごとの比較により、構造内の未使用の「穴」に存在するランダムビットを見つけることができます(このようなパディングは、後のフィールドの配置を正しく保つために使用されます)。フィールドごとの比較では、大きな構造に対して許容できない量の反復コードが必要になる場合があります。コンパイラによって生成された比較では、すべての場合にポインタフィールドを適切に比較することは期待できませんでした。たとえば、char*フィールドを==ではなくstrcmpと比較することが適切な場合がよくあります。

2つの構造を比較する必要がある場合は、フィールドごとに独自の関数を作成する必要があります。

于 2012-05-09T07:40:37.543 に答える
1

cは、構造体の==比較を行うための言語機能を提供しません

于 2012-05-09T07:36:08.637 に答える
1

構造を比較することはできません。標準(C11 6.5.9 Equality operators)は次のように述べています。

One of the following shall hold:
- both operands have arithmetic type;
- both operands are pointers to qualified or unqualified versions of compatible types;
- one operand is a pointer to an object type and the other is a pointer to a qualified or unqualified version of void; or
- one operand is a pointer and the other is a null pointer constant.

struct time残念ながら、いずれもに適用されません。==とでフィールドを個別にチェックするか、&&と比較できる別の不変の構造を持つ必要がありますmemcmp

後者の提案は構造内のパディング情報に反する可能性があることに注意してください。したがって、パディングがないことがわかっている場合を除いて、前者がおそらく最善の策です。。

于 2012-05-09T07:43:51.353 に答える