質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

220閲覧

char aとchar b[n]の型名はどちらともcharなのか?

gogojp

総合スコア211

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2019/02/28 15:24

c

1 struct table { 2 int no; 3 char name[20]; 4 int age; 5 };

とあるC言語のテストで、構造体tableの2番目のメンバの型名はなにかという問題が出題されました。
この場合は2番目のメンバのchar name[20]の型名はなにかという問題になります。

Aさんは「型名はchar」と答えて正解でした。
しかし、Bさんは「型名はchar[20]」と答えて不正解でした。
そこである人は「この問題はchar[20]じゃね」と言っていました。
自分はchar型だと思っており、要素数は型名には当てはまらないと思っています。

実際のところ、charかchar[20]どっちが正しいのでしょうか?

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

これは、プログラミングと言うより、用語の意味の問題ですね。

C言語のJIS規格(JISX3010)によると、

6.7.6 型名

意味規則
幾つかの文脈では、型を指定することが必要となる。型の指定は、型名(type name)を使って行う。型名は、構文的にはその型の関数又はオブジェクトの宣言から識別子を取り去った形に相当する。

と先生の間違いは明かです。
例として挙がっているのは、

int, int , int [3], int ()[3], int ()[*], int (), int ()(void), int (*const [])(unsigned int, ...)

C++やC#が同じ定義かどうかは知りません。
規格書はコピペできず、手打ちしたのでタイプミスがあればごめん。

投稿2019/02/28 16:16

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

C++

1// Visual C++ 2 3#include <typeinfo> 4#include <string> 5#include <iostream> 6 7struct table { 8 int no; 9 char name[20]; 10 int age; 11}; 12 13int main(){ 14 using namespace std; 15 table t; 16 cout << typeid(t.name).name() << endl; 17 cout << typeid(t.name[20]).name() << endl; 18}

実行結果:

char [20] char

ってわけで、nameの型は char[20]

投稿2019/02/28 22:16

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これは char[20] でないとおかしいです。もし char だとしたら、次のコードが成立してしまいます。

struct table { int no; char name[20]; int age; } struct table p; p.no = 1; strncpy(p.name, "Name", 20); p.age = 20; // これはおかしいでしょう? char c = p.name; // こちらなら問題ないけど char c = p.name[0];

投稿2019/03/01 00:16

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

普通に考えればchar[20]型となります。

正答がchar型であると仮定すると

2番目のメンバのchar name[20]の型名はなにかという問題になります。

この理解が正しいかが問題になる気がします。

例えば
「構造体tableの2番目のメンバ**は何型の配列か?**型名を示せ」

c

1 struct table { 2 int no; 3 型名 name[20]; 4 int age; 5 };

「上の構造体の型名の部分を穴埋めしろ」
という問題ならば、正答がchar型になるでしょう。

投稿2019/02/28 21:37

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

構造体tableの2番目のメンバchar name[20];にて定義していますから、そのメンバ名はnameですね。
nameの型はchar型の要素20個の配列ですね。流石にこれをchar型と答えたら誤りです。(先生はミスったのではないかと思います。もしも万が一ミスではないとの回答だったら、怖いかも...)

その型名は何か?というと微妙ですがC++コンパイラに訪ねたらchar[20]と答えるものが多いと思います。

typeid(対象の変数).name() で「型名」が返ってきます。gcc系のコンパイラではマングルされた名前(コンパイラにとって都合の良い名前)が返ってくるのでデマングルする必要があります。VC++なら慣れた名前で返ってきます。

wandboxによる実行例。

投稿2019/02/28 16:43

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

name はなに?という問題じゃなく、name[]の型を聞かれてるなら、
char ですね

nameは、char型の配列。
name[0] はどう見ても char型ですね。

投稿2019/02/28 15:28

編集2019/02/28 15:31
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問