- ベストアンサー
構造体宣言 エラー
下記の構造体の宣言で struct table{ int hour, minute, second; }; void main(void){ table t; t = { 8,25,0}; のように書くとエラーが出てしまい、 void main(void){ table t ={ 8,25,0}; とすると問題ありません。 テキストをいろいろ読みましたが、納得できる理由を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
定義と初期化を同時に行なう場合は当該の書き方を許しますが、 定義と初期化が同時でない場合は当該の書き方を許さず、 t.hour = 8; t.minute = 25; t.second = 0; のように書く必要があると、文法で決まっているのだと思います。 この考え方は構造体に限らず、配列の場合も同じだと思います。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
既に回答が出ているように、{ 8,25,0}が式ではないため、代入演算子のオペランドになることができません。 構造体の初期化子を使って代入したい場合は、 t = (struct table){ 8,25,0}; のように複合リテラルを使えば可能です。ただし、C99でなければ使えません。 ところで、structを省略しているところから見て、C++でしょうか? それだとやはり複合リテラルは使えません。コンストラクタを使うようにするか、適当な関数か演算子を定義するなどしてください。 また、mainの返却値がvoidということは、非標準処理系か自立処理系だと思います。非標準処理系の場合は処理系独自の事情があると思うので、処理系を補足するかマニュアルを熟読してください。
- aigaion
- ベストアンサー率47% (287/608)
一言で言うと,{8, 25, 0}が式ではないからです. t = { 8,25,0}; のような,代入文は右辺の値は必ず値を返す式です. ここで言う,式とは数学的な物ではなくC言語の仕様が式と定義しているものです. {8, 25, 0}はC言語では,値を持ちませんので式ではありません. table t ={ 8,25,0}; のような,宣言文では右辺は,式の他に初期化子を取ることを許しています. 右辺の値が式であれば,その値で初期化し,初期化子であれば特別に定義された方法で初期化します. {8, 25, 0}は,この初期化子にあたります. 同じ=に見えてつかわれる場所によって意味が違います. C言語を本格的に理解しようとおもうなら一度,言語仕様に触れてみるのも良いと思います. C言語仕様 (ISO/IEC 9899 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf
お礼
配列でも同じようなエラーになりました。 あまり深く考えず、このような決まりごとだと理解します。 ありがとうございました。