エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
探検
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
2016/11/06(日) 22:58:02.60ID:dU5z27As
861デフォルトの名無しさん
2017/07/05(水) 23:29:36.43ID:0KIeSgEp862デフォルトの名無しさん
2017/07/06(木) 01:22:17.04ID:AOJFjP+S >異なる考えの言語同士であるため対応が自明でないという事実を無視して
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない
ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない
ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど
863デフォルトの名無しさん
2017/07/06(木) 05:15:51.23ID:5a/RGiY/ わざわざ堅苦しい言葉選んで俺偉いアピール
864デフォルトの名無しさん
2017/07/06(木) 05:29:37.28ID:T7F4pxe5 同じ様な意味と同じ意味は違う
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)
865デフォルトの名無しさん
2017/07/06(木) 08:09:44.50ID:TSgBvSRK >>862
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか
>「違う意味だよ〜」って言ってたんじゃなかったの?
→Yes
>同じ意味だよ vs 違う意味だよだった
→Yes
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか
>「違う意味だよ〜」って言ってたんじゃなかったの?
→Yes
>同じ意味だよ vs 違う意味だよだった
→Yes
866デフォルトの名無しさん
2017/07/06(木) 08:11:58.37ID:rcg+ZZ7N 違うものは違う
867デフォルトの名無しさん
2017/07/06(木) 08:12:32.60ID:TSgBvSRK868デフォルトの名無しさん
2017/07/06(木) 08:18:45.02ID:QfwLuwwY869デフォルトの名無しさん
2017/07/06(木) 14:54:52.15ID:m/Ia1fy1 まだやってんのかよ
おまいらのこだわりはスゲェな
おまいらのこだわりはスゲェな
870デフォルトの名無しさん
2017/07/06(木) 22:06:42.25ID:TSgBvSRK リンク先を見て思ったのだが
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
871デフォルトの名無しさん
2017/07/06(木) 22:08:34.16ID:JPWXM8i2872デフォルトの名無しさん
2017/07/07(金) 11:58:06.67ID:C1hAccX9 俺は、プログラミングなんて存在しない世界で生きたい
873デフォルトの名無しさん
2017/07/07(金) 12:21:24.92ID:2bQkb9bH 生まれてくるのが100年くらい遅かったようだな
874デフォルトの名無しさん
2017/07/07(金) 12:21:27.14ID:xvg52mfm プログラマ辞めれば良いだけやん。
875デフォルトの名無しさん
2017/07/07(金) 13:29:12.14ID:1UwaMcEr c++
英語を読める
btcをトレードしたことがある
仮想通貨の開発に参加してみたい方
レスをお願いします
英語を読める
btcをトレードしたことがある
仮想通貨の開発に参加してみたい方
レスをお願いします
876デフォルトの名無しさん
2017/07/07(金) 15:01:32.91ID:u5D8E4qs877デフォルトの名無しさん
2017/07/07(金) 16:03:32.34ID:1UwaMcEr >>876
お返事ありがとうございます
通貨名
raiblocks
simple
instant
fees 0(送金手数料がかからない)
web
https://raiblockscommunity.net/
slack
https://raiblocks.slack.com
slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
お返事ありがとうございます
通貨名
raiblocks
simple
instant
fees 0(送金手数料がかからない)
web
https://raiblockscommunity.net/
slack
https://raiblocks.slack.com
slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
878デフォルトの名無しさん
2017/07/08(土) 21:39:10.74ID:dFvfrYOE プログラミングなんて底辺ドカタの仕事
そのうちAIがやれるようになる
そのうちAIがやれるようになる
879デフォルトの名無しさん
2017/07/08(土) 22:33:35.86ID:lbAgDi9M アドバイスさんくす
880デフォルトの名無しさん
2017/07/09(日) 16:06:32.28ID:EeQkMvgZ ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
>>880
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
882デフォルトの名無しさん
2017/07/09(日) 16:20:52.70ID:v/7piv3Y >>880
pとarrayは異なるオブジェクトだから確認方法が間違ってる
pとarrayは異なるオブジェクトだから確認方法が間違ってる
883デフォルトの名無しさん
2017/07/09(日) 16:25:25.83ID:3Luqddjj 一つのポンタを複数のオブジェなんて当たり前
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;
884デフォルトの名無しさん
2017/07/09(日) 16:43:15.93ID:EeQkMvgZ >>881 これでいいでしょうか?
int i;
int array[5];
int *p = array;
int **pp = &p;
printf("array : %d\n", array);
for(i = 0; i < 5; i++) {
printf("&array[%d] : %d\n", i, &array[i]);
}
printf("p : %d\n", p);
for(i = 0; i < 5; i++) {
printf("&p[%d] : %d\n", i, &p[i]);
}
printf("pp : %d\n", pp);
for(i = 0; i < 5; i++) {
printf("&pp[%d] : %d\n", i, &pp[i]);
}
>>882
&ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか?
>>883
すいませんまだそれを理解するのは難しいです。
int i;
int array[5];
int *p = array;
int **pp = &p;
printf("array : %d\n", array);
for(i = 0; i < 5; i++) {
printf("&array[%d] : %d\n", i, &array[i]);
}
printf("p : %d\n", p);
for(i = 0; i < 5; i++) {
printf("&p[%d] : %d\n", i, &p[i]);
}
printf("pp : %d\n", pp);
for(i = 0; i < 5; i++) {
printf("&pp[%d] : %d\n", i, &pp[i]);
}
>>882
&ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか?
>>883
すいませんまだそれを理解するのは難しいです。
885デフォルトの名無しさん
2017/07/09(日) 16:44:50.47ID:3Luqddjj 何がわからんのや。ようわかるやんけ
アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型
アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型
886デフォルトの名無しさん
2017/07/09(日) 16:51:56.41ID:EeQkMvgZ >>885
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
887デフォルトの名無しさん
2017/07/09(日) 16:56:52.17ID:3Luqddjj888デフォルトの名無しさん
2017/07/09(日) 17:01:52.64ID:EeQkMvgZ >>887
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
889デフォルトの名無しさん
2017/07/09(日) 17:16:44.02ID:Uu/MlKNR >>880
> &pp[0] : 2293468
これはpのアドレス
> &pp[1] : 2293472
> &pp[2] : 2293476
pp[1], pp[2]は存在しないからアクセスしちゃダメ
たぶん
2293464: pp
2293468: p
2293472: array[0]
2293476: array[1]
2293480: array[2]
みたいなメモリ割り当てになってるんだろうな
> &pp[0] : 2293468
これはpのアドレス
> &pp[1] : 2293472
> &pp[2] : 2293476
pp[1], pp[2]は存在しないからアクセスしちゃダメ
たぶん
2293464: pp
2293468: p
2293472: array[0]
2293476: array[1]
2293480: array[2]
みたいなメモリ割り当てになってるんだろうな
890デフォルトの名無しさん
2017/07/09(日) 22:31:05.00ID:WeAgIUgc891デフォルトの名無しさん
2017/07/09(日) 23:28:17.80ID:1po+7Ikw >>890
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
892デフォルトの名無しさん
2017/07/10(月) 06:50:03.40ID:ZgtWUD/x 中身にアクセスしてなくてただのアドレス計算だぞ
C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも
C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも
893デフォルトの名無しさん
2017/07/10(月) 06:54:34.99ID:t9ouoliu アドレス計算自体はOKだと思うよ。
2017/07/10(月) 07:04:04.53ID:Ols/UzwR
配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
2017/07/10(月) 07:05:58.47ID:ZgtWUD/x
無効エリアのアドレス計算
値不定か動作不定かどっちだか忘れた
これらをOKと呼ぶならOKなんでしょう
値不定か動作不定かどっちだか忘れた
これらをOKと呼ぶならOKなんでしょう
2017/07/10(月) 07:13:12.05ID:ZgtWUD/x
>>894
-1も有効だとうれしい事があるけど、-1はダメなんだよね
-1も有効だとうれしい事があるけど、-1はダメなんだよね
897デフォルトの名無しさん
2017/07/10(月) 22:27:20.57ID:WIOZS2V0 >>894
つまり式「&pp[1]」は大丈夫でないと?
つまり式「&pp[1]」は大丈夫でないと?
898デフォルトの名無しさん
2017/07/11(火) 13:12:04.11ID:eWIFW1BW ppは配列じゃないだろ
899デフォルトの名無しさん
2017/07/11(火) 18:17:43.80ID:L5b0rMHK これがアスペいうやつだな
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
pは配列じゃないからな→わかる
ppは配列じゃないからな→頭悪いな
ppは配列じゃないだろ→アスペ
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
pは配列じゃないからな→わかる
ppは配列じゃないからな→頭悪いな
ppは配列じゃないだろ→アスペ
900デフォルトの名無しさん
2017/07/11(火) 20:17:20.41ID:gS+YojZ9 ん?まったくよくわからんのだが、だれか解説して
>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね
で、下二行の意味も分からない
>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね
で、下二行の意味も分からない
901デフォルトの名無しさん
2017/07/11(火) 22:08:22.53ID:qjau/h5c 配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
902デフォルトの名無しさん
2017/07/11(火) 22:10:11.51ID:qjau/h5c903デフォルトの名無しさん
2017/07/11(火) 22:14:58.67ID:qjau/h5c904デフォルトの名無しさん
2017/07/11(火) 22:28:18.47ID:gS+YojZ9 いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う
つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う
つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
905デフォルトの名無しさん
2017/07/11(火) 23:00:18.82ID:634mVLA8 >>901
なら&pp[1]も大丈夫なんじゃね?
なら&pp[1]も大丈夫なんじゃね?
906デフォルトの名無しさん
2017/07/12(水) 07:01:19.46ID:Mf+sZV2C pp[1]の時点で動作不定
正しく動かない環境はもしかしたら存在しないかもしれないけど
正しく動かない環境はもしかしたら存在しないかもしれないけど
>>880
ん、最初にもどってメッセージを書くとすれば、こうなるかな
>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる
>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない
>>881 では意味のないことを求めてしまいごめんなさい
ん、最初にもどってメッセージを書くとすれば、こうなるかな
>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる
>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない
>>881 では意味のないことを求めてしまいごめんなさい
908デフォルトの名無しさん
2017/07/12(水) 08:20:30.93ID:SNfdy8To909デフォルトの名無しさん
2017/07/12(水) 09:01:11.94ID:6a7v2dDL910デフォルトの名無しさん
2017/07/12(水) 09:10:12.68ID:6a7v2dDL911デフォルトの名無しさん
2017/07/12(水) 13:20:57.39ID:ahqaJGrL >>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
912デフォルトの名無しさん
2017/07/12(水) 13:41:52.51ID:uqOuLEsE そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
913デフォルトの名無しさん
2017/07/12(水) 13:42:12.78ID:uqOuLEsE 気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
914デフォルトの名無しさん
2017/07/12(水) 13:43:43.81ID:uqOuLEsE よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
915デフォルトの名無しさん
2017/07/12(水) 13:48:37.49ID:vq82ZnF5 3行で(´・ω・`)
916デフォルトの名無しさん
2017/07/12(水) 17:58:12.38ID:SNfdy8To 駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
917デフォルトの名無しさん
2017/07/12(水) 18:07:40.57ID:SNfdy8To918デフォルトの名無しさん
2017/07/12(水) 18:19:22.64ID:Oma/x2r0 ユーザーヘッダーファイルを作って
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
919デフォルトの名無しさん
2017/07/12(水) 18:34:20.99ID:+I30gFZ0 void nyuuryoku(void) {
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
printf("ちゃんと入力しろやボケ\n");
return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
printf("ちゃんと入力しろやボケ\n");
return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}
920デフォルトの名無しさん
2017/07/12(水) 18:44:41.01ID:FRCEttse921デフォルトの名無しさん
2017/07/12(水) 18:45:48.34ID:+I30gFZ0 %lfちゃうか?
922デフォルトの名無しさん
2017/07/12(水) 18:46:07.89ID:+I30gFZ0 失礼しますた
923デフォルトの名無しさん
2017/07/12(水) 18:49:05.30ID:Oma/x2r0 oh....
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました
924デフォルトの名無しさん
2017/07/12(水) 19:24:59.74ID:iSKiMIM1 -Wallつけるか、clang使え
925デフォルトの名無しさん
2017/07/12(水) 21:38:59.46ID:Q4X+sAyq >>912-914
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
926デフォルトの名無しさん
2017/07/12(水) 23:05:57.46ID:2e79StFo 最近のチラシは両面印刷で困る
927デフォルトの名無しさん
2017/07/13(木) 00:31:49.82ID:/oMuxl/G928デフォルトの名無しさん
2017/07/13(木) 01:06:35.55ID:+2MHjXyv >>912-914は基礎的なところで間違った理解をしていると
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
930デフォルトの名無しさん
2017/07/13(木) 07:12:43.09ID:/oMuxl/G >929
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
>>930
シンタックスではなくセマンティクスというわけですか‥ありがとう
シンタックスではなくセマンティクスというわけですか‥ありがとう
932デフォルトの名無しさん
2017/07/13(木) 18:16:27.80ID:PDgj9Ebq #include<stdio.h>
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?
933デフォルトの名無しさん
2017/07/13(木) 18:29:33.51ID:lX8cJUTX 笑われてんじゃね?
934デフォルトの名無しさん
2017/07/13(木) 18:30:25.16ID:lX8cJUTX マヂレスすると、nameが不定
935デフォルトの名無しさん
2017/07/13(木) 18:34:34.28ID:a0isPZOF >>932
char name[NUM * 2 + 1] = {0};
char name[NUM * 2 + 1] = {0};
936デフォルトの名無しさん
2017/07/13(木) 18:37:48.37ID:PDgj9Ebq ありがとうございました
937デフォルトの名無しさん
2017/07/13(木) 19:34:29.65ID:b1PvI/zl どうでもいいけど、
char name[NUM * 2 + 1] = "";
普通こうじゃね?
char name[NUM * 2 + 1] = {'??0'};
これでも良い
コンパイル結果はたぶん全部同じだけど
char name[NUM * 2 + 1] = "";
普通こうじゃね?
char name[NUM * 2 + 1] = {'??0'};
これでも良い
コンパイル結果はたぶん全部同じだけど
938デフォルトの名無しさん
2017/07/13(木) 20:27:20.55ID:bV5zFMan >>932
俺のところで試してみたらフフフノフフフになった
俺のところで試してみたらフフフノフフフになった
939デフォルトの名無しさん
2017/07/13(木) 20:43:44.17ID:lX8cJUTX Visual Studio のデバッグビルドだと、不定メモリをCCで埋める
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん
strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん
strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
940デフォルトの名無しさん
2017/07/13(木) 21:06:57.04ID:a0isPZOF >>937
= {'\0'};のタイプミスだよね?
= {'\0'};のタイプミスだよね?
941デフォルトの名無しさん
2017/07/13(木) 21:23:18.88ID:lX8cJUTX942デフォルトの名無しさん
2017/07/13(木) 23:03:34.21ID:xdHlDIka プログラム終了にexit 0とreturn 0がどう違いますか?
944デフォルトの名無しさん
2017/07/14(金) 19:19:48.00ID:TW7O0pB9 というタワゴトで他人を陥れるのであった
945片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 19:26:30.76ID:RoIBY40S exitは死のトラクターが働かない
946片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 19:32:27.26ID:RoIBY40S 異常終了以外でexitを使うヤツは素人
947デフォルトの名無しさん
2017/07/14(金) 20:20:31.05ID:8ghhANnS えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
948片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 20:52:35.05ID:RoIBY40S #include <iostream>
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}
950デフォルトの名無しさん
2017/07/14(金) 21:04:08.43ID:TW7O0pB9 今日の>>945は健常者
後始末される例外ケースについて触れていたら完璧だった
後始末される例外ケースについて触れていたら完璧だった
951デフォルトの名無しさん
2017/07/14(金) 21:06:50.82ID:VdC9hBdZ atexit で後始末回収機構走らないの?
953片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 21:46:17.67ID:RoIBY40S atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。
954片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 21:53:53.48ID:RoIBY40S マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。
955デフォルトの名無しさん
2017/07/14(金) 22:54:13.51ID:RlDfzlps つまりexit()はバカ発見器ってこと?
956片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 23:01:28.54ID:RoIBY40S C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。
957デフォルトの名無しさん
2017/07/15(土) 05:41:00.21ID:81gh4ly6958デフォルトの名無しさん
2017/07/15(土) 13:25:52.33ID:d+yGYUAe ポインタの作法に慣れないです
読めるけどかけないです
読めるけどかけないです
959デフォルトの名無しさん
2017/07/15(土) 16:38:44.94ID:sZ4h7fLQ ポインタは2段までしか使わないなあ
関数ポインタはstd::functionに入れる癖がついたし
関数ポインタはstd::functionに入れる癖がついたし
960デフォルトの名無しさん
2017/07/15(土) 17:20:33.71ID:d+yGYUAe #include<stdio.h>
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- 【維新国会議員が800万円超の公金を使用】藤田文武共同代表が印刷代569万円を維新市議の「身内企業に支出」していた! [ぐれ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 ★2 [おっさん友の会★]
- 【ペルソナ・ノン・グラータ】中国総領事の早期国外退去を首相に要請へ 自民・保守系グループ「日本の尊厳と国益を護(まも)る会」 [ぐれ★]
- 【Jリーグ】モンテディオ山形 新スタジアム会員、募集停止 資金計画を再調整、年明け再開予定 [鉄チーズ烏★]
- 高市さん「自賠責を勝手に他の財源に充てるな、返せ」財務省さん、しぶしぶ5700億円を返還 [881878332]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
- 【高市】まず父さんの首切り発言が元なのにそれはスルーなのレスバのテクって感じだよな、ジャップって卑怯な癖してこの技術はない [213647114]
- 【悲報】日本、パンダ0にwwwwwwwwwwww高市さんありがとう🐼 [271912485]
- 安倍晋三「円が300円になったらトヨタ車が3分の1で売れる。日本への旅費も3分の1になる。そうすればあっという間に経済は回復していく」 [177178129]
