enumもtypedefも知っていますが下記コードのような
typedef enumを使用したものがどういった場面で有効なのかを簡単な具体例を使って教えてください。

enum {
    E1,
    E2
} E;

typedef enum {
    e1,
    e2
} e;

特に前者と後者を使いを分ける状況の違いについて教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

1)enum{E1,E2}E;


タグ名は省略したenum(列挙)型を定義する。enum{E1,E2}型の変数Eを宣言する。
1)ではenum{E1,E2}型の変数Eを宣言してる。

2)typedef enum{e1,e2}e;
タグ名は省略したenum(列挙)型を定義する。enum{e1,e2}型を新しい型e型と定義する。
2)ではenum{e1,e2}型をeという新しい型で定義をしてる。変数の宣言は行われない。

1)の場合、関数の中で新しく変数宣言する場合
#include<stdio.h>
enum{E1,E2} E;
int main()
{
int …;
double …;
enum{E1,E2} a1;//enum{E1,E2}型の変数a1を新たに宣言

…;
return 0;
}

2)の場合
#include<stdio.h>
typedef enum{e1,e2}e;
int main()
{
int …;
double …;
e a1;//e型の変数a1を新たに宣言

…;
return 0;
}

2)の方がコーディング量が減って楽。
もし2)でtypedefしないと、
e a1;
の部分を
enum{e1,e2} a1;
と書かなければならない。
だから、関数の引数として用いたり、関数の中で新しく変数を宣言する場合は、長ったらしい列挙型の部分を、typedefを用いて新しい短い型名として定義しておいた方が楽じゃんって事


とゆー事で良いですか?
回答が的を得てるのかいまいち自信がないですけど
    • good
    • 3

前者は無名enum型変数宣言であり、後者は別名型定義です。

使い分けるというものではなくて、そもそも効果が違います。

enumについては5種類の書き方があり、

1) enum E { e1, e2 };
2) enum E { e1, e2 } v;
3) enum { e1, e2 } v;
4) typedef enum E { e1, e2 } Ea;
5) typedef enum { e1, e2 } Ea;

というものです。

(1)は標準的な"型定義のみの"記法です。

(2)は(1)の効果に加えて、変数宣言も同時に行うものです。このときvの型はEです。

(3)は変数宣言を行う記法です。このときはvの型は"無名"になり、プログラム中でvの型を記述することはできません。

(4)は型定義と型の別名宣言を同時に行う書式です。Eの別名Eaを宣言しています。これはenum Eと書かずにE2に書けるようにするためで、単に記述がしやすくなることを狙ったものです。

(5)は(4)から型の名前を除いたものです。enumのオリジナルの型は無名になってしまいますが、(3)と違い、E2として型名を参照できるので、プログラム中で無名型をE2として再利用することが出来ます。
    • good
    • 8

ふつうに考えると Egame と Emusic は「別の型」だと思います。

可読性が悪くなったのは、本来別の型である Egame や Emusic を同じ型にしてしまったのが原因。

だから、
typedef enum {
n64,
pstation
} Egame;
typedef enum {
jazz,
rock
} Emusic;
のように Egame や Emusic を定義して
Egame game = n64;
Emusic music = jazz;
と使うものでしょう。
    • good
    • 1

struct と typedef struct の違いとにています。



すなわち、同じenumの型をもつ変数を複数定義するとき、あらかじめtypedefしておけば簡潔に書ける、ということです。

つまりプログラムの記述のしやすさに影響するのみで、生成されるコードに違いはありません。

この回答への補足

ありがとうございます。typedef structで思い出しました。

enum {
    n64,
    pstation
} Egame;
Egame = n64;

enum {
    jazz,
    rock
} Emusic;
Emusic = jazz;



if (Emusic == jass) {…

上記のような2つのenumの定義を下記のコードのようにするとスッキリするというものでしょうか?
下記のコードはスッキリしましたが、例えば
if (Emusic == E2) {…
の可読性については上記コードに劣るものになってしまいました。
もっとよい例がございましたら教えてください。
下記のコードの可読性の弱点を克服できる考えもございましたら教えてください。

typedef enum {
    E1,
    E2
} Entertainment;

Entertainment Egame, Emusic;
Egame = E1;
Emusic = E2;



if (Emusic == E2) {…

補足日時:2004/05/13 01:29
    • good
    • 2

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語(gcc), Linux, FTPプログラミング

C言語でFTPを使用してあるサーバからデータをダウンロードするプログラムを作りたいのですが、短期間で作らなければならない為、なるべく作り込みはしたくないのです。
FTPを扱うライブラリのようなものがあるのが一番ありがたいのですが、ご存じないでしょうか?
条件としては
・gccのバージョン3~4ぐらいで使えること。
・Solaris,RedHatなど主要なLinuxで使えること。
・ライセンスの制限がなるべく無いこと。
以上、よろしくお願いいたします。

Aベストアンサー

> FTPでアップロードは出来るという記述はあったのですが

私は逆にget出来る、の記述しか見つけられませんでした。
http://www.libcurl.org/ より:
> libcurl is a free, open source client to get documents/files from servers, using any of the supported protocols.

対応プロトコルの数を考えるとちとftp専用としてはサイズが大きそうな気はしますが、簡単に使えそうではありますね。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QC言語でCGI

C言語でCGIをやるにはサーバがtelnetを使えないと絶対だめですか?
たとえばローカルのLINUX環境でコンパイルしてそれをFTPでサーバにアップロードする方法では出来ないでしょうか?何か方法があれば教えてください。

Aベストアンサー

>C言語でCGIをやるにはサーバがtelnetを使えないと絶対だめですか?

ローカルとサーバで、コンパイラ/OS/CPUなどがまったく同じであれば、
ローカル側でコンパイルしたCGIがサーバ側で動く可能性もありますが、
止めておいた方がよいでしょう。
普通は、サーバ上でコンパイルする事になります。

だから、サーバにリモートログインしてコンパイルを実行する事になりますね。

または、JAVAでCGIするという手もあります。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QC言語はC言語でできている?

C言語はC言語でできている?

C言語はC言語でできていると耳にしたことがあります。

一体どういうことですか?

詳しく教えて下さい。

Aベストアンサー

歴史的な経緯を考えれば解ると思います。

当初は機械語でプログラミングをしていました。
それがアセンブラに変わります。
アセンブラでコンパイラが作成され、高級言語が作られていきます。
アセンブラまたは、高級言語の1つを使って、C言語用のコンパイラが作成されたとします。
今度は、そのC言語用のコンパイラを使用して開発ができるわけです。
ですので、そのC言語用のコンパイラを使用して、
C言語用の別のコンパイラを作成することも可能になります。

おそらく質問者さんの聞かれていることはこのことだと思います。

他の例では、MSは、VisualStudioで、次のバージョンのVisulaStudioを開発しています。
ややこしいですね。><

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

QMPLAB C18のC言語について

趣味でPICをはじめて、いままではアセンブラ言語でプログラムを書いてきました。
こんどPIC18Fに挑戦しようと思っているんですが、PIC18FはC言語で書いた
ほうがいいらしいですね。無料でMPLAB C18というC言語のコンパイラが使えるらしいですし。
C言語は勉強したことがないので、とりあえずC言語を勉強しなければならないんですが、
C言語っていろいろ種類があるんですね。C,C++,C#、あとvisual basic系のCとか。
なんだかさっぱりわかりません。

MPLAB C18のC言語にもっとも近いのはどれでしょうか。おしえてください。

Aベストアンサー

>C,C++,C#、あとvisual basic系のCとか。

だいぶ誤解があるようです。

C言語は、ISOやJISの規格で決まっている言語規格の事で単にCと略することがあります。でこれは規格の名前なので、どこの会社がつくっても良いですし、オープンソース開発されているC言語のコンパイラもあります。
なのでA社のCやらB社のCやらいろんなのがありますが機能・規格はある程度統一されています。

で他のC++,C#、あとvisual basic系のCについて説明します。

C++はC言語を大幅に拡張した言語でオブジェクト指向を取り入れた言語です。C言語よりも重いので小型マイコンではまず使えません。C18もC++の規格は取り入れられていないはずです。

C#となるとさらに重く最新の言語でマイクロソフト社提案の言語です。DelphiやJavaやC++などをベースに設計された言語でC言語とは大幅に文法が異なります。Cと言う名前が付いているのはマイクロソフト社の戦略的ネーミングです。

あとvisual basic系のCはVisualStudioのCではないでしょうか?
それとvisual basicは昔流行ったBASICの流れをくむオブジェクト指向言語ですが、これまたC言語とは文法は異なります。
それで、VisualStudioはマイクロソフトの開発環境のの名前で無料で手に入るのは、VisualBasic2010Express、VisualC#2010Express、VisualC++2010Expressです。
このうち、VisualC++2010ExpressはC言語かC++を扱うことの出来る開発環境ですので、ny36さんの目的にはかなっていると思います。

ただし、VisualC++2010ExpressとC18では使える入出力関数が違いますのでいきなりC18で始めてしまった方が混乱が無くて良いかも知れません。

「電子工作室」
http://www.picfun.com/mccframe.html

ちなみに「PIC18FはC言語で書いたほうがいいらしいですね。」と言うのは絶対ではないです。アセンブラで組んでも構いませんが私はC言語のほうが楽だと思います。
それは普通のPICにも言えるんですけどね。

>C,C++,C#、あとvisual basic系のCとか。

だいぶ誤解があるようです。

C言語は、ISOやJISの規格で決まっている言語規格の事で単にCと略することがあります。でこれは規格の名前なので、どこの会社がつくっても良いですし、オープンソース開発されているC言語のコンパイラもあります。
なのでA社のCやらB社のCやらいろんなのがありますが機能・規格はある程度統一されています。

で他のC++,C#、あとvisual basic系のCについて説明します。

C++はC言語を大幅に拡張した言語でオブジェ...続きを読む

Qtemplateクラス中のtypedef enumを戻り値にする方法

こんにちは、VisualStudio2003でtemplateの使い方の学習中です。
言葉で書くと難しくなりますのでソースを書きます。
<h>
template<class MYTYPE> class CTreeMng
{
public:
CTreeMng(void);
~CTreeMng(void);
typedef enum {
SUCCESS// 成功
} RESULT;
RESULT SetPotision( NODE_POSITION pos );
};
<cpp>
template<class MYTYPE> CTreeMng<MYTYPE>::CTreeMng(void){}
template<class MYTYPE> CTreeMng<MYTYPE>::~CTreeMng(void){}
template<class MYTYPE> CTreeMng<MYTYPE>::RESULT CTreeMng<MYTYPE>::SetPotision( ){}
---------------------------------------------------------
上記の場合、
template<class MYTYPE> CTreeMng<MYTYPE>::RESULT CTreeMng<MYTYPE>::SetPotision( )
が、以下エラーとなります。
TreeMng.cpp(31): warning C4346: 'CTreeMng<MYTYPE>::RESULT' : 依存名は型ではありません。
仮に、
template<class MYTYPE> RESULT CTreeMng<MYTYPE>::SetPotision( )
でも、
TreeMng.cpp(31): error C2143: 構文エラー : ';' が 'CTreeMng<MYTYPE>::SetPotision' の前にありません。
となります。
正しい書き方は、どのように書けばよろしいのでしょうか?
アドバイスお願いします。

こんにちは、VisualStudio2003でtemplateの使い方の学習中です。
言葉で書くと難しくなりますのでソースを書きます。
<h>
template<class MYTYPE> class CTreeMng
{
public:
CTreeMng(void);
~CTreeMng(void);
typedef enum {
SUCCESS// 成功
} RESULT;
RESULT SetPotision( NODE_POSITION pos );
};
<cpp>
template<class MYTYPE> CTreeMng<MYTYPE>::CTreeMng(void){}
template<class MYTYPE> CTreeMng<MYTYPE>::~CTreeMng(void){}
template<class MYTYPE> CTreeMng<MYTYPE>::RESULT CTreeMng<MY...続きを読む

Aベストアンサー

 こんばんは。

 ×template<class MYTYPE> CTreeMng<MYTYPE>::RESULT CTreeMng<MYTYPE>::SetPotision( ){}
 ↓
 ○template<class MYTYPE> CTreeMng<MYTYPE>::RESULT CTreeMng<MYTYPE>::SetPotision(NODE_POSITION pos){}

 余談ですが、実の所、テンプレートはヘッダーのみに書くものです。

QC言語は全くの素人なのですが・・・

C言語は全くの素人(C言語って何?レベル)でも独学で市販のテキスト(初めてのC言語など)などを使って取得出切る物ですか?もしC言語の勉強を始める前にこれだけはしておいた方が楽にC言語の勉強に入って行ける様な勉強がありましたら是非、教えて下さい。

Aベストアンサー

#1さんと同意見です。プログラミング言語初体験でC言語はお薦めしません。

>独学で市販のテキスト(初めてのC言語など)などを使って取得出切る物ですか?

取得出来るかもしれません。が、確率が低い、と思います。
参考事例を二つほど。
まず、独学じゃなくて、大学で「強制的に習わされる」としても、非常に学生の宿題の丸投げ率が高い言語です(笑)。これは特筆に値します。結論から言うと、「学校で習わされる」としても「最初に学ばせる」にはキツい言語だ、と言う事ですね。大学側もその事実を把握してんだかしてないんだか(笑)。つまり、「プログラミングを学ぶ」目的には適してない、と言う事です(逆に言うと、「別の言語を習得していて」「C言語を学ぶ」なら可、なんですが)。
最近でも、全く知らない人からいきなりメールが来て、この宿題

課題 ex3:
http://edu.inf.shizuoka.ac.jp/lecture/2006/X121/exercise/ex3.html

を教えてくれ、とか書いてました(笑)。その学生が丸っきり勉強してないんだか、それとも静岡大学の情報学部のカリキュラムにそもそも無理があるんだか(笑)。
いずれにせよ、「学校で教える」にせよ手子摺るのがC言語です。独学ならなおさらキツい、と思います。「C言語って何?レベル」だとなおさら、でしょうね。
第二に「入門書の類の出版数が多すぎる」と言う事です。「書籍数が多いのは良い事だ」と思われるかもしれませんが、個人的には逆、だと思っています。言い換えると「入門書として定番書籍が存在しない」と言う事を意味している、と思います。
つまり、事実上、「習わされる言語=自分で"学びたい"と思う言語ではない」んで、外的要因(例えばそれこそ「学校でやらされる」あるいは「就職に有利な言語」として)でC言語を学ぶわけですが、どの入門書も根本的な意味では「決定打ではない」と言う事です。だからこそ雨後の筍のように「C言語入門」がどんどん出版されている、と言う(笑)。しかし、結局「どの本も分かり辛い」のです。だから「C言語入門書」ってのは数が多い。
これは入門書の作者陣が「説明が下手糞」なのか(笑)。まあ、そう言う部分もあるでしょうが、別な見方をすると、「C言語をプログラミング初心者に説明する」と言う事自体が土台「無理がある」と言う事でしょうね。そうとしか思えません。つまり、「定番書籍」と言える定番書籍があるわけがない、と言う事になります。
(出版社観点だと、逆に言うと「商売的にオイしい」分野かもしれません・笑)

>これだけはしておいた方が楽にC言語の勉強に入って行ける様な勉強

つまり、それは「C言語を勉強する前にもっと別の簡単な言語を習得してる」方が良い、と言う事です。それが一番の勉強法です。
恐らく、「動的型付け言語」と言われる種類の言語を使って、まずは「プログラミング」自体に慣れた方が良いでしょう。その後「C言語」をやった方が結果効率的です。
個人的にはSchemeが好きなんですが、今度は「プログラミング入門書」と言える入門書が無いです(笑)。それはそれで困り物(当然!)です。
類するような動的型付け言語として、候補としては

・Python
・Ruby
・JavaScript

なんかがあります。このうち、JavaScriptは構文スタイルはCやJavaに似てるんですが、これも「JavaScript単体で上手くプログラミングを教える」入門書は、知ってる限り存在しないんで除外します。
結局、PythonかRubyをまずは使ってみる、ってのが一番良いでしょうね。色々調べてみると、Rubyの方が日本語で読める情報が多い、です。恐らく「まずはRubyを使って」「プログラミング自体を」学んでからCに移った方が良いでしょう。
Rubyはオンラインの日本語で読める「プログラミング入門」がPythonよりも良くって、特に「なるべくお金を使わずにプログラミングを覚えたい」のならRubyの方がお薦めですね。
まずは次のチュートリアル

プログラミング入門 - Rubyを使って - :
http://www1.tf.chiba-u.jp/~shin/tutorial/

辺りで「プログラミング自体」に慣れてみてください。

#1さんと同意見です。プログラミング言語初体験でC言語はお薦めしません。

>独学で市販のテキスト(初めてのC言語など)などを使って取得出切る物ですか?

取得出来るかもしれません。が、確率が低い、と思います。
参考事例を二つほど。
まず、独学じゃなくて、大学で「強制的に習わされる」としても、非常に学生の宿題の丸投げ率が高い言語です(笑)。これは特筆に値します。結論から言うと、「学校で習わされる」としても「最初に学ばせる」にはキツい言語だ、と言う事ですね。大学側もその事実を把握し...続きを読む

Qブロックで };ついているのと }だけの差はなんでしょうか

皆様こんにちは^^
 さて、以下のプログラムの{}ブロックで質問があります。
 {ブロック+セミコロン};と{セミコロンなし}があります。
 };で最後にセミコロン;がついていますが!これは何の意味があるのでしょうか!?
 1時間ぐらい調べましたが、該当する項目がありませんでした。
 よろしくお願いいたします。
#include <stdio.h>
#include <string.h>

/* 学生の人数 */
#define GAKUSEI_NUM 3

/* 構造体の定義 */
struct TestKekka
{
char shimei[80];
int kokugo;
int sugaku;
int eigo;
};
int main(int argc, char* argv[])
{
int i,heikin;
/* 構造体の配列の宣言 */
struct TestKekka gakusei[GAKUSEI_NUM];

/* 学生のデータ入力する */
for (i = 0; i < GAKUSEI_NUM; i++)
{
printf("氏名:");
scanf("%s", &gakusei[i].shimei);
printf("国語の得点:");
scanf("%d", &gakusei[i].kokugo);
printf("数学の得点:");
scanf("%d", &gakusei[i].sugaku);
printf("英語の得点:");
scanf("%d", &gakusei[i].eigo);
printf("---------------\n");
}

/* 学生ごとの平均点を表示する */
for (i = 0; i < GAKUSEI_NUM; i++)
{
heikin = (gakusei[i].kokugo + gakusei[i].sugaku + gakusei[i].eigo)/ 3;
printf("%sの平均点%d\n", gakusei[i].shimei, heikin);
printf("----------------\n");
}

return 0;
}

皆様こんにちは^^
 さて、以下のプログラムの{}ブロックで質問があります。
 {ブロック+セミコロン};と{セミコロンなし}があります。
 };で最後にセミコロン;がついていますが!これは何の意味があるのでしょうか!?
 1時間ぐらい調べましたが、該当する項目がありませんでした。
 よろしくお願いいたします。
#include <stdio.h>
#include <string.h>

/* 学生の人数 */
#define GAKUSEI_NUM 3

/* 構造体の定義 */
struct TestKekka
{
char shimei[80];
int kokugo;
int sugaku;
...続きを読む

Aベストアンサー

for文、関数の{}はそれで完結しているので文法上 ; は必要ありません。
構造体 struct の {}は、 } の後に変数名(もしくは別名)を書くことも可能なので、終端を示す ; が必要になります。

いずれも、C言語の文法で定義されています。

struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
};



struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
} testkekka; ← 変数名

もしくは、

typedef struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
} TESTKEKKA; ← 別名

など。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング