- 1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net]
- 何にも知らない0からの出発、超初心者のためのC++相談室
- 80 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:06:59 ID:8YawtAIF.net]
- >>77
文字列リテラルの指す文字列は書きかえてはいけない。 char* の指す先の文字列は書きかえできる。 const char* の指す先の文字列は書きかえできない。
- 81 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:07:03 ID:K0jT0mUL.net]
- 何故文字配列なのに文字列を沢山入れられるのか…
- 82 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:09:49 ID:8YawtAIF.net]
- >>77
あーわかった。あんたがエラーメッセージを読んで理解しようとしないから分からないんだよ。
- 83 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:16:45 ID:K0jT0mUL.net]
- 分かりません。
ポインタを直接文字列の値で初期化してるのもよくわからないです。
- 84 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:38:11 ID:5oVnKxXT.net]
- char *s = "abc"; がダメな理由と
int a[] = { 1, 2, 3 }; がOKな理由を考えろ
- 85 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:47:05 ID:Fjn1hDTG.net]
- const char* MONTH_NAME[]=
型 変数名[] 各要素の型は、const char* [ ] は配列 最近、ロベールは本屋で売ってない
- 86 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:51:54 ID:Fjn1hDTG.net]
- Ruby なら、変数名はラベルだから、変数に再代入できるけど
a = "a" a = "abc"
- 87 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:53:56 ID:K0jT0mUL.net]
- >>84
char* sはchar型の変数の参照が入ってないから駄目なのでは? 下はただの配列変数だからできてるのでは?
- 88 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 21:05:23 ID:K0jT0mUL.net]
- >>85
const char*という新しい型があるのですか? constとは定数を宣言するだけのものじゃないのでしょうか
- 89 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 21:49:00 ID:K0jT0mUL.net]
- char* str[]={"aaa","bbb","ccc"}はできないのに
const char* str[]={"aaa","bbb","ccc"}はエラーにならないのも意味わからないです const chr*のエンティティ云々も意味不明なのですがロベール188pまでにその説明は載ってるのでしょうか
- 90 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 21:54:43 ID:5oVnKxXT.net]
- じゃあ const char *s = "abc"; がわからないのか
これはどこかにある "abc" という配列へのポインタでsを初期化しなさいっていう意味で、 char *s = "abc"; がダメなのは "abc" が変更不可だから あとは const char *s = "abc"; と const char *MONTH_NAME[] = { "睦月", ... }; の関係が int i = 0; と int a[] = { 0, ... }; の関係と同じであることを考えればわかるはず
- 91 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 22:11:15.73 ID:8YawtAIF.net]
- >>89
「できない」理由はエラーメッセージに書いてあるだろ。読めよ。
- 92 名前:デフォルトの名無しさん mailto:age [2020/05/06(水) 22:58:31 ID:K0jT0mUL.net]
- >>90
文字列って定数なんですか? 何となく分かってきた気がします!細かく教えていただきありがとうございます
- 93 名前:デフォルトの名無しさん [2020/05/07(木) 12:23:12 ID:iKRewGMt.net]
- >>77
const 付けたくないなら char MONTH_NAME[][5]={"睦月,"如月,"弥生"......
- 94 名前:デフォルトの名無しさん [2020/05/07(木) 17:22:45 ID:8jv+kISL.net]
- char r[] = "hoge";
char *s = "hoge"; const char *t = "hoge"; char *MONTH_NAME_A[]={"睦月","如月","弥生"}; char MONTH_NAME_B[][7]={"睦月","如月","弥生"}; どれもエラーも警告も出んかった
- 95 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 18:27:09 ID:wkYaXeHy.net]
- char *t = "hoge";
これがエラーにならないのは言語上の欠陥
- 96 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 06:37:37 ID:Br/73fC2.net]
- ロベールさんで紹介してる環境に限定されると語れる立場じゃないんだが…。
>>93 漢字1文字を2byteと仮定するのは危険じゃないかしら。 このごろUTF-8でベタに文字列書くことが多いんでちょい気になる。 と言ってu8プレフィックス付けるほどお行儀良くもない中途半端な人。 >>94 char *s = "hoge"; で警告出ないとは ストラウストラップ先生がガッカリしそうなコンパイラね。
- 97 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 09:24:37 ID:0HhOrENw.net]
- >>95
C++11 以降の言語仕様では許していない。 それより前の仕様では許していたという歴史的経緯があるので (エラーではなく) 警告にとどめている処理系がまあまあ有るという事情。
- 98 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 09:31:38 ID:oIDbptWL.net]
- C++
https://ideone.com/lWQYBs C++14 https://ideone.com/2CLzMB どっちもスルーされる
- 99 名前:デフォルトの名無しさん mailto:age [2020/05/08(金) 21:53:35 ID:+i26a8kQ.net]
- ロベールの入門書に /*構造体変数student*/
int length = sizeof stundent /sizeof *student というのがあるのですが何故これで配列の要素数が出るのでしょうか? sizeof student / sizeof student[0]だと配列の要素数が出る理屈は何となく分かるのですが 配列とポインタは別のものですよね?
- 100 名前:デフォルトの名無しさん [2020/05/08(金) 22:21:29 ID:/+tKw0XQ.net]
- student[0] と *student は同じ
- 101 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 23:07:29 ID:+i26a8kQ.net]
- 何で同じなのでしょうか?これで動くからこういうもの。という理解で大丈夫なんでしょうか
- 102 名前:デフォルトの名無しさん [2020/05/08(金) 23:48:12 ID:xx+9oYGy.net]
- MSの陰謀。
- 103 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 06:15:34 ID:LKKpAq9a.net]
- とりあえず stundent は誤りで正しくは student だとして
多くの場合、配列名は「配列の先頭要素を指すポインタ」と解釈される、から。 つまり配列studentについて student == &student[0] が成り立つ。 *演算子を作用させて *student == *&student[0] == student[0] よって sizeof *student == sizeof student[0] ここで注意すべき点は「配列名がsizeof演算子のオペランドになった場合は 配列の先頭要素を指すポインタとは解釈されない」ってこと。 sizeof 配列名 == 配列全体が占有するメモリ容量 なぜそうなっているか、という理由は「そう決めると便利だから」かな。 Cの頃からそういう感じでプログラム書いてたから、という歴史的経緯もある。 >>102 初心者をからかっちゃアカンよ。信じちゃうかも知れん。
- 104 名前:デフォルトの名無しさん [2020/05/09(土) 09:28:26 ID:3rxWY8lS.net]
- コロチャンもゲイツの陰謀とか言ってる人が居てわろす
温暖化も陰謀ω
- 105 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/09(土) 10:52:17 ID:MmeKQuXy.net]
- >>99
「暗黙の型変換」によって配列がポインタに型変換されるルールがある。 スムーズにポインタとして使えてしまうから混同してわけわからんようになる初心者が多いんだけど、 あくまでも別物であるという理解が出来ているなら入門者としてはかなり優秀だと思う。 ほとんどの場合に配列はポインタに暗黙に型変換されるんだけど、 例外としては ? sizeof を適用するとき ? 単項の & を適用するとき ? 参照で受け取るとき があって、これらの状況では型変換されずに解釈される。 ---- 余談だけど暗黙の型変換とは別に仮引数の調整というのもあって、 関数の仮引数として配列を書いた場合も配列はポインタに調整される。 たとえば void foo(int a[10]) {} という定義を書いたら void foo(int* a) {} と全く同じように解釈される。
- 106 名前:デフォルトの名無しさん mailto:age [2020/05/11(月) 03:00:46 ID:II69MMpE.net]
- すいませんロベール持ってる人にお聞きしたいのですが
305ページの for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが このsizeというローカル変数は何処に定義されてるんでしょうか?
- 107 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 05:46:42 ID:k4wInV7m.net]
- >>106
“ロベール本”を持ってないので答えられない立場かも知れんけど…。 この size は「ここ」で定義されているんだと思うよ。 for の初期化式 int i = 0, size = a.Size(); で、 「int の i」と「int の size」という2つの変数を定義している。
- 108 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 07:45:03.87 ID:II69MMpE.net]
- >>107
forの中で2つ宣言できるんですね!そんな事も知りませんでした。 ありがとうございます。
- 109 名前:デフォルトの名無しさん [2020/05/11(月) 09:53:48 ID:MhpqGE2N.net]
- 型が違うときは?
for (long i = 0, int size = a.Size(); i < size; ++i)
- 110 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 19:53:43.37 ID:8B6Lebzi.net]
- C++17なら
for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)
- 111 名前:デフォルトの名無しさん mailto:age [2020/05/21(木) 23:33:00 ID:fIo5j0A9.net]
- class DataStore {
public: DataStore(int v) : mValue(v) {} bool operator==(const DataStore& rhs) const; private: int mValue; }; bool DataStore::operator==(const DataStore& rhs) const { return mValue == rhs.mValue; } int main() { DataStore ds1(10), ds2(10); if (ds1 == ds2) {} } というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか? 後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです
- 112 名前:デフォルトの名無しさん mailto:sage [2020/05/21(木) 23:57:47 ID:ut4Weg2U.net]
- operatorも、ただの関数
if (ds1.operator==(ds2)) {}
- 113 名前:デフォルトの名無しさん mailto:sage [2020/05/22(金) 00:55:03.99 ID:H9gcgSgg.net]
- const DataStore& rhsの実引数はds1ってことですか?
- 114 名前:デフォルトの名無しさん mailto:sage [2020/05/22(金) 06:44:02 ID:8neFOyTD.net]
- この流れだと、仮パラメータ rhs にバインドされる実引数は ds2 でしょ。
クラスのメンバ関数として宣言された2項演算子の operator OP(rhs) は、 lhs OP rhs と書くと lhs.operator OP(rhs) が呼び出される。 …と書いても分かりにくいね。 具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、 ってのが >>112 の人の言ってること。
- 115 名前:デフォルトの名無しさん mailto:sage [2020/05/22(金) 09:23:45 ID:JweU/zGV.net]
- 余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。
(標準ライブラリでもだいたいそうなってる。)
- 116 名前:デフォルトの名無しさん mailto:sage [2020/05/22(金) 12:29:55.77 ID:6NFPH2hn.net]
- constかどうかで決めるのはアホ
- 117 名前:デフォルトの名無しさん mailto:age [2020/05/30(土) 06:36:15 ID:1Zwy+dfa.net]
- なぜ文字から'0'を引くと数字を数値に変換できるのですか? char c='8' int a=c-'0'
理屈がよくわからないです。 よろしくお願いします
- 118 名前:デフォルトの名無しさん [2020/05/30(土) 07:25:50 ID:/FCD7s4m.net]
- 順番に並んでいるから。
- 119 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 07:33:59 ID:1Zwy+dfa.net]
- 文字コードが順番に並んでるのは分かったのですが
なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません よろしくお願いします
- 120 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 07:57:34.41 ID:/LdiluDZ.net]
- '0'を引かなくてもキャストせずにint型の変数に代入できるよ
c/c++では文字は整数型に文字コードを入れて扱うんだよ
- 121 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 08:07:04.11 ID:1Zwy+dfa.net]
- 苦しんで覚えるC言語という本の255ページに
”数字を使うときには引き算で本来の数値を知ることも出来ます。 数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。 数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。” とあるんですが ”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです
- 122 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 08:27:53 ID:CZP1xQZw.net]
- 文字が元々数値(文字コード)であることが理解できてないのでは
ASCIIコード表でググってみれ
- 123 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 10:03:05.95 ID:/LdiluDZ.net]
- 2に3を足す時、
int a = 2; int b = 3; int c = a + b; とやるとc == 5になる int a = '2'; int b = '3'; int c = a + b; とやってもc == '5'にはならない 今やほぼASCIIだからc == 'e'になる int a = '2' - '0'; int b = '3' - '0'; int c = a + b; とやるとc == 5になる '0'から'9'まで連続していることはcの規格が強制してるから これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味
- 124 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 16:37:51 ID:A5Abb6S3.net]
- char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型 // c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型 int a = c - '0'; // char型の数値8 で int変数a を初期化・代入 一般にint変数にchar型の値を格納することは認められている。 思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」) という部分に引っ掛かってるんじゃなかろうか。
- 125 名前:124 mailto:sage [2020/05/30(土) 16:49:13.96 ID:A5Abb6S3.net]
- すまん 124 は間違ってるみたい、忘れてくれ。
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型 // '0' ... '0'を表す文字コードの値(ASCIIでは48) char型 // c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型 int a = c - '0'; // 数値8 で int変数a を初期化・代入 思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」) という部分に引っ掛かってるんじゃなかろうか。 '8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード) std::cout << "sizeof('8') == " << sizeof('8') << '\n'; std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';
- 126 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 18:38:26.55 ID:1Zwy+dfa.net]
- >>125
そういうことでしたか。 詳しく噛み砕いていただきありがとうございます。
- 127 名前:124 mailto:sage [2020/05/30(土) 19:18:59.52 ID:A5Abb6S3.net]
- 型の検証はC++11なら直接的にできるね。
#include <typeinfo> ... std::cout << "'8' is " << typeid('8').name() << '\n'; std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n'; 実装定義の型の名前を得られる。
- 128 名前:デフォルトの名無しさん [2020/06/05(金) 17:55:42 ID:8OoEw/S/.net]
- なかなか、適当なスレを見付けるのが難しいわい
C++ 且つ初心者だから、ここでいいのかな subroutine で、例えば、boolean と string のふたつの変数の値を return するには、やっぱり std::map を使うのが一番簡単でしょうかね?
- 129 名前:デフォルトの名無しさん [2020/06/05(金) 18:21:06 ID:Uv2w5eYU.net]
- std::pair<>じゃないのか?
https://ja.cppreference.com/w/cpp/utility/pair
- 130 名前:デフォルトの名無しさん [2020/06/05(金) 19:03:13.94 ID:8OoEw/S/.net]
- うーん、なんとなくそうおもいます、ええ
- 131 名前:デフォルトの名無しさん [2020/06/05(金) 19:06:38.66 ID:8OoEw/S/.net]
- あ、では、boolean, string, int の三つをreturn するには普通どうやるのが王道でしょうか?
- 132 名前:デフォルトの名無しさん [2020/06/05(金) 19:08:18.91 ID:8OoEw/S/.net]
- 連投すまん。
std::tuple ですか。
- 133 名前:デフォルトの名無しさん [2020/06/05(金) 19:12:47.23 ID:Uv2w5eYU.net]
- たぶんそうだとお芋ます、ええ。
あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。 今回は関係なさそうですが。
- 134 名前:デフォルトの名無しさん [2020/06/21(日) 13:29:09 ID:hTPD8Gtd.net]
- >>131
王道かどうかは知らんが、C++17以降なら auto func() { return std::make_tuple(a, b, c); } auto [f, s, n] = func(); っていう風にできるで
- 135 名前:デフォルトの名無しさん [2020/06/21(日) 16:38:41.93 ID:rRP2z2l8.net]
- std::tie の方が好き
- 136 名前:デフォルトの名無しさん mailto:sage [2020/06/22(月) 16:40:35.96 ID:sjaABjGh.net]
- C++でint[変数]というようなことが出来ないのはstack overflow防止のためなんでしょうか?
- 137 名前:はちみつ餃子 mailto:sage [2020/06/22(月) 16:50:40.23 ID:H8+bL0cM.net]
- >>136
原則として型は大きさが決まっているもんなので、そうでないものがあるとややこしいんだわ。 (配列の大きさは型の一部。)
- 138 名前:デフォルトの名無しさん mailto:sage [2020/06/22(月) 20:24:27.49 ID:83jG8pXe.net]
- Cの新しいのだと出来る
- 139 名前:はちみつ餃子 mailto:sage [2020/06/22(月) 22:04:26.97 ID:H8+bL0cM.net]
- >>138
新しいの……? C99 で出来るようになったけど C11 以降ではオプショナル扱いなんだわ。 そして今年は 2020 年なんだわ。
- 140 名前:デフォルトの名無しさん mailto:sage [2020/06/22(月) 23:23:01.67 ID:rtw5aKlF.net]
- Cは89/90が基本
- 141 名前:デフォルトの名無しさん [2020/06/23(火) 01:32:00.34 ID:UY2AjBBL.net]
- 以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか? typedef SubType* LPSUBTYPE; template<> inline bool greater<LPSUBTYPE>::operator() (const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const { … }
- 142 名前:デフォルトの名無しさん mailto:sage [2020/06/23(火) 09:26:35 ID:RMSfHJVB.net]
- >>141
エラーメッセージを読んで問題点を解決するように書き直すといいよ。 list に比較関数は渡せないと思うので前提が間違ってそうな気もする。
- 143 名前:デフォルトの名無しさん mailto:sage [2020/06/29(月) 08:08:09.53 ID:PYBXxpGI.net]
- VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?
- 144 名前:デフォルトの名無しさん mailto:sage [2020/06/29(月) 18:23:34.98 ID:gWW+3u18.net]
- C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
- 145 名前:デフォルトの名無しさん mailto:age [2020/09/08(火) 02:57:29 ID:ZBc9FXfY.net]
- 何で構造体のchar配列は直接値が代入できず
strcpyを使う必要があるのでしょうか?
- 146 名前:デフォルトの名無しさん [2020/09/08(火) 03:20:04.77 ID:jacy6RM2.net]
- できるよ
struct A { int x; char b[4]; } a = {0, 1, 2, 3, 4};
- 147 名前:はちみつ餃子 mailto:sage [2020/09/08(火) 05:15:54.57 ID:QZgDAT7o.net]
- >>146
それは代入ではなくて初期化
- 148 名前:デフォルトの名無しさん mailto:sage [2020/09/08(火) 05:56:11.78 ID:ZBc9FXfY.net]
- typedef struct {
char str[32]; }A; int main(}{ A a; a.str="aaa"; } これができないってことです 言葉足らずですいません
- 149 名前:デフォルトの名無しさん [2020/09/08(火) 08:44:00.12 ID:h4K4tlm9.net]
- int main(void) {
int arr[5]; arr = 3; } ができないのと同じ理由です
- 150 名前:デフォルトの名無しさん mailto:sage [2020/09/08(火) 09:53:15.41 ID:zoI9JNor.net]
- かわいいw
- 151 名前:デフォルトの名無しさん mailto:sage [2020/09/08(火) 10:55:42 ID:0vfIbeP0.net]
- ちょっと忘れたから、推測だけど、
a.str="aaa"; "aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか? 例えば、4バイトのサイズで、10〜13 アドレスに存在する場合に、10が代入されるとか char str[32]; 一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
- 152 名前:デフォルトの名無しさん [2020/09/08(火) 11:16:05 ID:h4K4tlm9.net]
- 意図してるだろうことを無理してやるなら
str[0] = 'a'; str[1] = 'a'; str[2] = 'a'; str[3] = '\0'; でできる.そしてこれをするためにstrcopyがある
- 153 名前:デフォルトの名無しさん [2020/09/08(火) 15:36:44.61 ID:JkCXGknl.net]
- >>148
型が違うし
- 154 名前:デフォルトの名無しさん mailto:sage [2020/09/08(火) 15:57:15.69 ID:SNM207t1.net]
- 出来ない訳じゃないんだよな
typedef struct { char b[4]; } A; int main(void) { A b = {1, 2, 3, 4}; A a; a = b; // ok a.b = b.b; // bad return 0; } 自分で for で配列要素代入すれば良い訳で 面倒だから memcpy や strcpy 使ってるだけ
- 155 名前:デフォルトの名無しさん [2020/09/08(火) 16:02:13.68 ID:JkCXGknl.net]
- >何で構造体のchar配列は直接値が代入できず
構造体のchar配列だけじゃなくて ただのchar配列でもダメだろ 宣言と同時に代入してるときはたまたま出来るだけ int main() { char a[4] = "abc"; // OK char b[4]; b = "abc"; // BAD return 0; }
- 156 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 20:41:42.30 ID:s+S5qxFe.net]
- >char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート たまたま、ってw
- 157 名前:デフォルトの名無しさん mailto:sage [2020/09/09(水) 23:49:08.55 ID:N/YnHGom.net]
- はじめたころは、こういうことにいちいちひっかかってたな…
わかっちゃえば、慣れちゃえばどーってことないんだけど
- 158 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 00:06:01.62 ID:Qspm/kAl.net]
- 同じようでいて、初期化と代入では見た目の作用がことなることがあるね
- 159 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 00:07:00.73 ID:Qspm/kAl.net]
- 見た目「と」作用が
- 160 名前:デフォルトの名無しさん mailto:sage [2020/09/10(木) 15:36:27 ID:rLZBXCmM.net]
- a も b も代入禁止だ
- 161 名前:デフォルトの名無しさん mailto:sage [2020/09/19(土) 09:19:26.77 ID:z/ngkL1p.net]
- >>157
常に初心に返ることで新たにわかることもある
- 162 名前:デフォルトの名無しさん mailto:age [2020/09/21(月) 06:30:22.99 ID:GP+Uv9qA.net]
- C#ですいません
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて イマイチ言ってる意味がわからないので 簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
- 163 名前:デフォルトの名無しさん [2020/09/21(月) 10:35:12.49 ID:M8W5JifW.net]
- 文字だけじゃないコード・・・
- 164 名前:デフォルトの名無しさん mailto:sage [2020/09/21(月) 11:38:59.68 ID:xNmUS8x8.net]
- 寿限無名予防以外の目的?
- 165 名前:デフォルトの名無しさん [2020/09/21(月) 11:59:08.18 ID:IzAwgxqY.net]
- >>162
C#よくわかってないけど こういうことが知りたいの? https://ideone.com/SP3uBF
- 166 名前:デフォルトの名無しさん mailto:sage [2020/09/21(月) 21:53:00.21 ID:GP+Uv9qA.net]
- >>165
すいません、そういうことです。 usingについてはおかげさまで意味が分かりました。ありがとうございます。 namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、 どっからどの部分までが名前空間なのでしょうか
- 167 名前:デフォルトの名無しさん [2020/09/21(月) 23:03:56.25 ID:IzAwgxqY.net]
- >>166
namespaceがなかったら たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、 自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する (重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない) みたいな事態が発生してしまう さっきの例だと同名のメソッド(Console.WriteLine)を定義してても System名前空間とMyNS名前空間で分けたからコンパイルが通る System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの namespace Hoge { // {}内はHoge名前空間に属する }
- 168 名前:デフォルトの名無しさん mailto:sage [2020/09/22(火) 06:36:29.84 ID:ZtayyY2i.net]
- 完全にC++の感覚でしか説明できんけど、
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、 ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない) こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
- 169 名前:デフォルトの名無しさん mailto:sage [2020/09/22(火) 13:09:23.63 ID:iGBGeTHm.net]
- 名前空間を使うと検索性が最悪になる
(別の名前空間の同一名称が引っ掛かりまくる) みんなどう対処しているんだろう
- 170 名前:デフォルトの名無しさん mailto:sage [2020/09/22(火) 17:08:47.15 ID:QYfnOwKH.net]
- >>169
using namespaceするのが問題じゃない?
- 171 名前:デフォルトの名無しさん mailto:sage [2020/09/22(火) 17:49:49.66 ID:ZtayyY2i.net]
- いやusingに限らず、例えば>>168で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ
確かに検索で困ることはたまにある・・
- 172 名前:デフォルトの名無しさん mailto:sage [2020/09/22(火) 19:24:25.17 ID:Xh0fS725.net]
- namespace で絞り込んで、識別名をハイライトして、あとは気合
- 173 名前:デフォルトの名無しさん [2020/10/20(火) 13:37:38.41 ID:Mso39Itu.net]
- C++とVisual C++の違いについてです。
C++はプログラミング言語であり、 VC++は統合開発環境であるという説明があります。 でも私にはVC++がC++++のように見えます。 VC++はC++の文法に新たな流儀を付け加えるか置き換えていて 言語そのものの使用を若干変えているように見えます。 C++のキーワードが別のものに置き換わっていたりするからです。 そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。 この理解は正しいでしょうか。
- 174 名前:デフォルトの名無しさん mailto:sage [2020/10/20(火) 13:38:19.99 ID:Mso39Itu.net]
- 使用改め仕様
- 175 名前:デフォルトの名無しさん [2020/10/20(火) 14:39:40.58 ID:C+6cO9mm.net]
- 多少違うのは
#pragma くらいだろ 勝手に仕様なんて変えない 統合環境とか API とかはもちろん関係無い話
- 176 名前:デフォルトの名無しさん mailto:sage [2020/10/20(火) 20:36:08.28 ID:3YoHPXFg.net]
- IDEはVisual Studio
VC++はMSのC++商品名 C++/CLIとかを混同してね? これはC++を独自拡張したものだよ
- 177 名前:デフォルトの名無しさん mailto:sage [2020/10/20(火) 22:21:46.71 ID:qSDH25Or.net]
- __declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ
- 178 名前:デフォルトの名無しさん [2020/10/21(水) 11:12:14.17 ID:xBgAWF1Y.net]
- 描かずに済むけどな
- 179 名前:デフォルトの名無しさん [2020/10/21(水) 13:51:50.76 ID:WStrtR1y.net]
- C++/CLIは拡張ですか?
いくつかの流儀を置き換えていますよね? ポインタをハンドルと読んだり?
- 180 名前:デフォルトの名無しさん mailto:sage [2020/10/21(水) 14:12:49.21 ID:xLl2qqDk.net]
- MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは?
拡張でいいんじゃね
|

|