!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 161
https://mevius.5ch.net/test/read.cgi/tech/1682053520/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 162
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 2389-FUJr)
2023/10/30(月) 17:13:00.82ID:hHEGE8Ol061デフォルトの名無しさん (ワッチョイ 827c-RmzB)
2023/11/04(土) 14:07:46.76ID:nDDUhOSB062デフォルトの名無しさん (ワッチョイ 827c-RmzB)
2023/11/04(土) 14:20:50.41ID:nDDUhOSB063デフォルトの名無しさん (ワッチョイ 653d-2MVi)
2023/11/04(土) 15:58:28.43ID:lvandghk0 例の人ですか?
64デフォルトの名無しさん (ワッチョイ c191-HQPe)
2023/11/04(土) 19:42:10.24ID:Q+jfxr6/0 >>62
スレを私物化してないか?
スレを私物化してないか?
65デフォルトの名無しさん (ワッチョイ 4279-ztC3)
2023/11/04(土) 21:41:26.73ID:W1fOq5zR0 Cは単純だからぽいんた辺りで躓かない限り特に疑問は生まれずスーっと大脳皮質に浸透していく
それに比べて自称モダン言語の気持ち悪さよ
Cが無かったらプログラミングなんてやってなかったろうな
それに比べて自称モダン言語の気持ち悪さよ
Cが無かったらプログラミングなんてやってなかったろうな
66デフォルトの名無しさん (ワッチョイ 9901-jPjl)
2023/11/04(土) 21:47:47.71ID:vTgEadDD0 Cも関数ポインタとかたいがいきしょいぞ
67デフォルトの名無しさん (ワッチョイ 4279-ztC3)
2023/11/04(土) 21:53:04.57ID:W1fOq5zR0 Cの関数ポインタはそれ以上でもそれ以下でもない
セキュリティが緩い頃は関数ポインタを駆使すれば関数型言語で言う所の関数のファーストクラスも実現できた
この時やはりコードとデータは分かれているべきと判りみ
と同時にオブジェクト指向は間違った思想と気付く
セキュリティが緩い頃は関数ポインタを駆使すれば関数型言語で言う所の関数のファーストクラスも実現できた
この時やはりコードとデータは分かれているべきと判りみ
と同時にオブジェクト指向は間違った思想と気付く
68はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-oDOv)
2023/11/04(土) 21:57:40.47ID:ocaBqo/v0 少なくとも宣言については無茶苦茶な文法だけどな。
69デフォルトの名無しさん (ワッチョイ 9901-jPjl)
2023/11/04(土) 22:08:52.30ID:vTgEadDD0 C++になると更にきしょいメンバ関数ポインタがあるが
70デフォルトの名無しさん (ワッチョイ 9901-jPjl)
2023/11/04(土) 22:36:43.09ID:vTgEadDD0 #include <iostream>
using namespace std;
struct Hoge {
int hage_;
int mage () const {return hage_;}
};
void func (const Hoge &obj, int (Hoge::*func) () const) {
cout << (obj.*func) () << '\n';
}
int main () {
void (*f) (const Hoge &, int (Hoge::*) () const) {&func};
Hoge hoge {10};
(*f) (hoge, &Hoge::mage);
return 0;
}
きめぇ
using namespace std;
struct Hoge {
int hage_;
int mage () const {return hage_;}
};
void func (const Hoge &obj, int (Hoge::*func) () const) {
cout << (obj.*func) () << '\n';
}
int main () {
void (*f) (const Hoge &, int (Hoge::*) () const) {&func};
Hoge hoge {10};
(*f) (hoge, &Hoge::mage);
return 0;
}
きめぇ
71デフォルトの名無しさん (ワッチョイ 2e63-sdYh)
2023/11/05(日) 00:14:17.78ID:u007GASC0 次の仕様拡張で関数配列が導入されます(嘘)
72デフォルトの名無しさん (アウアウウー Saa5-CWlg)
2023/11/05(日) 10:34:57.51ID:ol9bMVcca73デフォルトの名無しさん (ワッチョイ 2e63-sdYh)
2023/11/05(日) 10:45:42.91ID:u007GASC0 定数はともかく変数の値の変化を監視するとなれば話は変わりますよ
74デフォルトの名無しさん (ワッチョイ c191-HQPe)
2023/11/05(日) 10:52:46.61ID:dHgdjFj0075デフォルトの名無しさん (アウアウウー Saa5-CWlg)
2023/11/05(日) 11:02:20.21ID:ol9bMVcca >>70
こう描けばそこまでキモくない
#include <iostream>
using namespace std;
struct Hoge {
int hage_;
int mage () const {return hage_;}
};
void func (const Hoge &obj, int (Hoge::*p) () const) {
cout << (obj.*p)() << '\n';
}
int main () {
void (*f) (const Hoge &obj, int (Hoge::*p) () const) = func;
Hoge hoge {10};
f(hoge, &Hoge::mage);
return 0;
}
こう描けばそこまでキモくない
#include <iostream>
using namespace std;
struct Hoge {
int hage_;
int mage () const {return hage_;}
};
void func (const Hoge &obj, int (Hoge::*p) () const) {
cout << (obj.*p)() << '\n';
}
int main () {
void (*f) (const Hoge &obj, int (Hoge::*p) () const) = func;
Hoge hoge {10};
f(hoge, &Hoge::mage);
return 0;
}
76デフォルトの名無しさん (アウアウウー Saa5-2ws7)
2023/11/06(月) 13:51:35.97ID:4BOQTpQoa >>75
using使えよ
using使えよ
77デフォルトの名無しさん (ワッチョイ 42ad-dLR+)
2023/11/08(水) 13:50:08.70ID:ySVrNoqw0 C++の話はスレチ
78デフォルトの名無しさん (ワッチョイ 4279-ztC3)
2023/11/08(水) 19:54:11.21ID:5o5qiXKK0 その言葉が聞きたかった
79あぼーん
NGNGあぼーん
80デフォルトの名無しさん (ワッチョイ ff02-qIOU)
2023/11/12(日) 08:32:02.96ID:d94Xl3Lo0 >>79
おー、これはワクワクするな
おー、これはワクワクするな
81デフォルトの名無しさん (ワッチョイ 1fdd-/atU)
2023/11/12(日) 08:34:12.27ID:GHx2Prj8082デフォルトの名無しさん (ラクッペペ MM4f-6FeI)
2023/11/12(日) 08:51:33.78ID:It/c5vypM ここまで自演
83デフォルトの名無しさん (ワッチョイ 7f7c-aEnJ)
2023/11/13(月) 22:12:34.37ID:6eyhepdG0 はじめてのCってタイトル狙ってるよね?
84デフォルトの名無しさん (ワンミングク MMdf-P3L0)
2023/11/14(火) 12:53:07.86ID:W6BGRK+OM なんかドキドキする💗
85デフォルトの名無しさん (ワッチョイ 1f10-Zoup)
2023/11/14(火) 15:40:13.41ID:Pq1b8U9m0 >はじめてのC
数十年前からの定番ネタだよね・・・今の中年向けの・・・。
数十年前からの定番ネタだよね・・・今の中年向けの・・・。
86デフォルトの名無しさん (ワッチョイ 1ff0-Gf4c)
2023/11/14(火) 15:56:04.92ID:B1tltd4R0 お前らはAの経験もないだろ
87デフォルトの名無しさん (ワッチョイ 9f46-ch54)
2023/11/14(火) 17:17:03.46ID:Qm0S65Zf0 小さく投げAするときも左利き。
88デフォルトの名無しさん (ワッチョイ 1f5f-Zoup)
2023/11/14(火) 17:23:51.01ID:0+a8UjLX0 消えたD言語もw
89デフォルトの名無しさん (アウアウウー Sae3-6ymb)
2023/11/14(火) 17:24:41.49ID:ehFVRHwha APLは経験ないな
90デフォルトの名無しさん (ワッチョイ ff63-lv/m)
2023/11/14(火) 17:26:26.82ID:juKbspbB0 魔球は魔球はハリケーン♪
91デフォルトの名無しさん (ワッチョイ 7fad-beIL)
2023/11/15(水) 02:42:58.51ID:FfQCTRFi0 >>90
あなたの年齢は50歳以上ですね。
あなたの年齢は50歳以上ですね。
92デフォルトの名無しさん (ワッチョイ 9fbb-7z1d)
2023/11/16(木) 19:17:29.74ID:j+PNeGK90 Cタ「バルス!」
93デフォルトの名無しさん (ワッチョイ ff46-uMtu)
2023/11/16(木) 20:52:49.80ID:oCahIYzp0 C名「歌舞伎町の女王」
94デフォルトの名無しさん (ワッチョイ 465f-jMfl)
2023/11/18(土) 16:08:05.16ID:rSBossZH0 今はABCって言っても通用しないよ
95デフォルトの名無しさん (ワッチョイ 6e46-4xZ8)
2023/11/18(土) 17:12:35.80ID:gr23gvrO096デフォルトの名無しさん (スップ Sd82-K/BJ)
2023/11/24(金) 17:31:57.03ID:yKOVmI8Pd 三等車か
97デフォルトの名無しさん (ワッチョイ a7bb-ayIT)
2023/11/25(土) 04:21:32.09ID:qagB2RQA0 Cの関数ポインタに慣れてしまってたんなに奇天烈に見えてたのに今じゃ可愛く見える
98デフォルトの名無しさん (ワッチョイ 5fad-1+JT)
2023/11/25(土) 04:36:14.81ID:D3zQdbUT0 ∧__∧
(´∀`)
(⊃⌒*⌒⊂)
/_ノωヽ_)
(´∀`)
(⊃⌒*⌒⊂)
/_ノωヽ_)
99デフォルトの名無しさん (ワッチョイ 7f63-YwKO)
2023/11/25(土) 10:00:22.54ID:NdoBt+NA0 目標をせんたーに入れてスイッチ
100デフォルトの名無しさん (スププ Sd7f-RFe5)
2023/11/27(月) 08:24:12.52ID:554QjvZVd 左辺値と右辺値のことがよくわからない
char *cp = "abcdefgの"abcdefg"は値を変更できないのに、
char cp[] = "abcdefg"の"abcdefg"は値を変更できる
char *cp = "abcdefgの"abcdefg"は値を変更できないのに、
char cp[] = "abcdefg"の"abcdefg"は値を変更できる
101はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/27(月) 09:01:26.52ID:HtoHgn5y0 >>100
それは左辺値/右辺値とは関係ない。
「リテラルを書き換えようとしたら未定義」というルールが関与してる。
前者の場合は文字列の場所を示すアドレスが cp に格納されているので
cp が指す先というのは文字列リテラルだが
後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので
配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。
初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと
(文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって
そういう変則的なルールの積み重ねが分かり難い要因だと思う。
リテラルは書き換えたら駄目なのに型の上では文字列リテラルに const はつかない (C++ では const が付く) ので
ごく単純な場合を除くと書き換えをコンパイラがコンパイル時にエラーとして検出できないこともある。
なるべく (前後の事情によっては出来ないこともあるけど) 変数には const を付けておくのが良い作法だと思う。
const char *cp = "abcdefg";
それは左辺値/右辺値とは関係ない。
「リテラルを書き換えようとしたら未定義」というルールが関与してる。
前者の場合は文字列の場所を示すアドレスが cp に格納されているので
cp が指す先というのは文字列リテラルだが
後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので
配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。
初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと
(文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって
そういう変則的なルールの積み重ねが分かり難い要因だと思う。
リテラルは書き換えたら駄目なのに型の上では文字列リテラルに const はつかない (C++ では const が付く) ので
ごく単純な場合を除くと書き換えをコンパイラがコンパイル時にエラーとして検出できないこともある。
なるべく (前後の事情によっては出来ないこともあるけど) 変数には const を付けておくのが良い作法だと思う。
const char *cp = "abcdefg";
102デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/27(月) 09:03:50.85ID:7/k6/GSga char *cpa = "abcdefg;
char cpb[] = cpa; // 出来ない
char cpc[] = "abcdefg";
char *cpd = cpc; // 出来る & abcdefgの中身も描き替え出来る
char cpb[] = cpa; // 出来ない
char cpc[] = "abcdefg";
char *cpd = cpc; // 出来る & abcdefgの中身も描き替え出来る
103デフォルトの名無しさん (ワッチョイ 7fab-LZ+J)
2023/11/27(月) 11:14:55.99ID:zMN468VW0 「大前提で文字列リテラルは書き換えたらダメ」があって
初期化と代入が同じ記号の = で行われてる
配列での代入操作は暗黙で先頭のポインタを渡す一方で
配列の初期化はあたかも複製をとったような形になる
ここらへんにややこしさがあってめぐりめぐって1行目にヒットする
初期化と代入が同じ記号の = で行われてる
配列での代入操作は暗黙で先頭のポインタを渡す一方で
配列の初期化はあたかも複製をとったような形になる
ここらへんにややこしさがあってめぐりめぐって1行目にヒットする
104デフォルトの名無しさん (スププ Sd7f-RFe5)
2023/11/27(月) 11:25:24.57ID:554QjvZVd >>101 ご親切にありがとうございます。標準的な本にもかいてあることを聞いてしまいました。
105デフォルトの名無しさん (エムゾネ FF7f-xen6)
2023/11/27(月) 12:06:42.49ID:65C4jQRRF106デフォルトの名無しさん (ワッチョイ 7fab-LZ+J)
2023/11/27(月) 12:39:47.73ID:zMN468VW0 "abcdefg"[2] = 'C'; これがNG
107デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
2023/11/27(月) 19:49:45.68ID:/cbu4sL+0 >ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの
まったく別と言い切ってしまうのはちょっと語弊があるように思う
言い換えれば配列はアドレスが変更できないポインタとみなせる
後は参照先のメモリ領域が書き換え可能かそうでないかの違いでしかない
まったく別と言い切ってしまうのはちょっと語弊があるように思う
言い換えれば配列はアドレスが変更できないポインタとみなせる
後は参照先のメモリ領域が書き換え可能かそうでないかの違いでしかない
108デフォルトの名無しさん (ワッチョイ 7f63-YwKO)
2023/11/27(月) 19:53:12.61ID:iryvQ0lx0 配列名は単に文字列が格納されている場所に付けられたラベル
109デフォルトの名無しさん (ワッチョイ 7f6a-l0Ve)
2023/11/27(月) 22:43:46.81ID:LIfK37a60 >>108
上で触れられているようにサイズ情報も持ってる
上で触れられているようにサイズ情報も持ってる
110デフォルトの名無しさん (スプッッ Sdff-z/Dz)
2023/11/28(火) 08:18:33.76ID:0HFLSmnDd >>109
それは別に配列だからってわけじゃない。
それは別に配列だからってわけじゃない。
111はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/28(火) 09:29:06.38ID:mRTkdYl90 配列の型は配列型だ。
char cpc[] = "abcdefg";
とあればこのときの cpc の型は char[8] をもつ。
式中に配列型の式が現れた場合には sizeof か & のオペランドであった場合を除いてその配列の先頭要素を指すポインタ (この場合は char*) に暗黙に型変換される。
変換が適用されればポインタだし、適用されない場面では配列。
配列自体は左辺値だが変更できる左辺値 (modifiable lvalue) ではないので代入演算子の左辺に現れることはできない。
配列を型変換を適用して出来るポインタは左辺値ではないのでやっぱり代入することは出来ない。
char cpc[] = "abcdefg";
とあればこのときの cpc の型は char[8] をもつ。
式中に配列型の式が現れた場合には sizeof か & のオペランドであった場合を除いてその配列の先頭要素を指すポインタ (この場合は char*) に暗黙に型変換される。
変換が適用されればポインタだし、適用されない場面では配列。
配列自体は左辺値だが変更できる左辺値 (modifiable lvalue) ではないので代入演算子の左辺に現れることはできない。
配列を型変換を適用して出来るポインタは左辺値ではないのでやっぱり代入することは出来ない。
112デフォルトの名無しさん (ワッチョイ dfc6-AnfR)
2023/11/28(火) 10:56:51.80ID:vcMwjchf0 え?左辺値に出来るやん
113デフォルトの名無しさん (ワッチョイ a76b-onFz)
2023/11/28(火) 15:19:32.77ID:87HNLOa+0 型の話って、実は結構難しいというか深いよね…
型を認識するプログラム作ってみるとわかるんだけど
「~のポインタである」と
「~の配列である」を同じ情報量では扱えなくて
「~の配列(要素数n)である」としないとだめなの
ポインタである ことは1ビットで保持できるのに、配列である は要素数があるから必要なビット数がやたら多いのよ
型を認識するプログラム作ってみるとわかるんだけど
「~のポインタである」と
「~の配列である」を同じ情報量では扱えなくて
「~の配列(要素数n)である」としないとだめなの
ポインタである ことは1ビットで保持できるのに、配列である は要素数があるから必要なビット数がやたら多いのよ
114デフォルトの名無しさん (ワッチョイ 4701-GgRN)
2023/11/28(火) 18:36:50.58ID:0ouam6Fz0 ((char*)cpc)++ で cpc[0] が 'b' を指すように移動できるの?
これがポインタが左辺値になってるって意味の理解でOK?
これがポインタが左辺値になってるって意味の理解でOK?
115デフォルトの名無しさん (ワッチョイ a763-YwKO)
2023/11/28(火) 19:17:29.83ID:7gZuadd+0 ++は無理
116デフォルトの名無しさん (ワッチョイ 47e7-xen6)
2023/11/28(火) 19:34:06.06ID:7TmihfNz0 アセンブラで考えるとよくわかる
cpa:
.dw cpa_static
cpa_static:
.db 'abcdef',0
cpc:
db 'abcdef',0
こんな感じになるだろう
cpaをインクリメントするのが可能だがcpcをインクリメントするのは無理なのがわかるだろう
cpcはアセンブル後には値がなくなる固定値でcpaは領域が確保されてる変数だから
cpa:
.dw cpa_static
cpa_static:
.db 'abcdef',0
cpc:
db 'abcdef',0
こんな感じになるだろう
cpaをインクリメントするのが可能だがcpcをインクリメントするのは無理なのがわかるだろう
cpcはアセンブル後には値がなくなる固定値でcpaは領域が確保されてる変数だから
117デフォルトの名無しさん (ワッチョイ a763-YwKO)
2023/11/28(火) 19:42:59.12ID:7gZuadd+0 >((char*)cpc)++
こんな風な事をしたいなら、
*(char*)cpc+i
これでどうだろうか
cpcは固定値で、加算も減算も出来ないが、その位置からのオフセットならとれる
でも、ふつうの人は cpc[i] こうするだろう
こんな風な事をしたいなら、
*(char*)cpc+i
これでどうだろうか
cpcは固定値で、加算も減算も出来ないが、その位置からのオフセットならとれる
でも、ふつうの人は cpc[i] こうするだろう
118はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/28(火) 20:11:54.43ID:mRTkdYl90 >>114
代入可能であるためには左辺値であることは必要条件なのだけれど十分条件ではない。
配列が代入の対象になりえないにも関わらず
(modifiable という概念を導入してまで) 左辺値という扱いにしていることからもわかるように、
代入できるかどうかで左辺値かどうかは語れない。
左辺値でも代入できないことはある。
右辺値はどこかに代入しない限り捨てられる (その式を超える寿命を持つことはない) という性質があるので
逆にそうでないものは左辺値という扱いにしないと辻褄が合わないからこうなってるんだと思う。
代入可能であるためには左辺値であることは必要条件なのだけれど十分条件ではない。
配列が代入の対象になりえないにも関わらず
(modifiable という概念を導入してまで) 左辺値という扱いにしていることからもわかるように、
代入できるかどうかで左辺値かどうかは語れない。
左辺値でも代入できないことはある。
右辺値はどこかに代入しない限り捨てられる (その式を超える寿命を持つことはない) という性質があるので
逆にそうでないものは左辺値という扱いにしないと辻褄が合わないからこうなってるんだと思う。
119デフォルトの名無しさん (ワッチョイ 5fdf-2qxF)
2023/11/28(火) 20:38:05.06ID:h0hB0aZz0120デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/29(水) 06:07:26.12ID:n75oaT1ga なんでcpcを++したいと思うんだろ
121デフォルトの名無しさん (ワッチョイ bf35-UyS0)
2023/11/29(水) 07:30:00.42ID:Dj4oipus0 左辺値かどうかの簡単な切り分けだと思っただけで
そういう欲求はない
そういう欲求はない
122デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 11:41:18.63ID:5J3ZheQvd >>111 正確には、配列名のことをいっているんでしょ?
123デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 11:43:26.36ID:5J3ZheQvd でないと文章的につじつまが合わない
124はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/29(水) 12:08:25.16ID:sncgHuaJ0 何を言ってるのだかわからん。
代入演算子の左辺に配列が現れることは出来ないという説明
に納得いかない (できる状況があると思っている) ということ?
代入演算子の左辺に配列が現れることは出来ないという説明
に納得いかない (できる状況があると思っている) ということ?
125デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 12:16:49.24ID:5J3ZheQvd >>124 そういうことです
126デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
2023/11/29(水) 12:18:51.59ID:UMPQWy8o0 代入可能な左辺値一覧
○…代入可能な左辺値
×…代入可能な左辺値ではない
1 変数に代入 v=x ○
2 変数のアドレスに代入 &v=x ×
3 配列に代入 a[i]=x ○
4 配列の名前に代入(2に相当) a=x ×
5 ポインタ変数に代入 p=x ○
5 ポインタ変数のアドレスに代入 &p=x ×
7 ポインタ変数の参照先に代入 *p=x ○ ただし参照先が書き込み可能でなければランタイムエラー
理解できたかね?
○…代入可能な左辺値
×…代入可能な左辺値ではない
1 変数に代入 v=x ○
2 変数のアドレスに代入 &v=x ×
3 配列に代入 a[i]=x ○
4 配列の名前に代入(2に相当) a=x ×
5 ポインタ変数に代入 p=x ○
5 ポインタ変数のアドレスに代入 &p=x ×
7 ポインタ変数の参照先に代入 *p=x ○ ただし参照先が書き込み可能でなければランタイムエラー
理解できたかね?
127デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 12:25:45.50ID:5J3ZheQvd >>126 まだまだ浅学な者で、3と4の違いが分かれば十分です
128デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 12:26:51.70ID:5J3ZheQvd 右辺値と左辺値に関しては
129デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 12:34:21.47ID:5J3ZheQvd char ss[5];
char *p;
p = ss; 〇
p = &ss[0]; 〇
ss = p; ×
p = ss + 2; 〇
p = &ss[2]; 〇
char *p;
p = ss; 〇
p = &ss[0]; 〇
ss = p; ×
p = ss + 2; 〇
p = &ss[2]; 〇
130はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/29(水) 12:41:04.72ID:sncgHuaJ0 配列 a があるとき
a[i]=x
という式の左辺は配列に添字演算子を適用したもの (配列の要素) であって
これのことを「配列に代入」と呼ぶと語弊がある。
a[i]=x
という式の左辺は配列に添字演算子を適用したもの (配列の要素) であって
これのことを「配列に代入」と呼ぶと語弊がある。
131デフォルトの名無しさん (スフッ Sd7f-1fOb)
2023/11/29(水) 12:54:49.45ID:5J3ZheQvd しかし、食べたらまずそうなコテハンですね('_')
132はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/29(水) 13:01:54.89ID:sncgHuaJ0 最初はSCHEME餃子と名乗ってたけどSCHEMEスレが過疎ってて暇だから
CスレC++スレにも書く機会が多くて途中で変えた。
私としてはあり得なさそうな組み合わせの語を選んだつもりだったのだけど
はちみつを使った餃子のレシピはあるみたいだよ。
CスレC++スレにも書く機会が多くて途中で変えた。
私としてはあり得なさそうな組み合わせの語を選んだつもりだったのだけど
はちみつを使った餃子のレシピはあるみたいだよ。
133デフォルトの名無しさん (スフッ Sd7f-RFe5)
2023/11/29(水) 13:56:20.69ID:5J3ZheQvd 配列には確かに構造体のようにごっそり代入できませんね
134デフォルトの名無しさん (ワントンキン MM3f-LVuv)
2023/11/29(水) 14:07:08.49ID:5SldHabaM 構造体に入れてしまえば解決
135デフォルトの名無しさん (ワッチョイ 7fab-LZ+J)
2023/11/29(水) 15:10:46.39ID:K/pKiYoT0 126 の表現を借りるなら
3 は配列の要素に代入
4 が配列に代入
こういう意識だわ
3 は配列の要素に代入
4 が配列に代入
こういう意識だわ
136デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
2023/11/29(水) 15:15:32.07ID:UMPQWy8o0 結局てめーの日本語が気に食わないって話かよ
長文は読む気が失せるわー
長文は読む気が失せるわー
137はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/29(水) 16:16:32.90ID:sncgHuaJ0 「配列は」という話をしているときに配列でなくする操作 (要素に対するアクセス) をすれば出来るみたいな話と混同されると困る。
138デフォルトの名無しさん (ワッチョイ 47e7-xen6)
2023/11/29(水) 20:22:44.16ID:odjcqh9C0 初心者のころ
char text[] = "Answer is _";
text[10] = 'A' + ans;
とか書こうとしてうろおぼえで
char *text = "Answer is _";
text[10] = 'A' + ans;
としたらエラーかワーニングになって
なんでできないんだよ!とずっと悩んでいたことがあるが
そういう話じゃないの?
char text[] = "Answer is _";
text[10] = 'A' + ans;
とか書こうとしてうろおぼえで
char *text = "Answer is _";
text[10] = 'A' + ans;
としたらエラーかワーニングになって
なんでできないんだよ!とずっと悩んでいたことがあるが
そういう話じゃないの?
139デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/30(木) 06:41:39.94ID:yOmuxKyka char a[] = "A";
char *p = a;
は別物(同じだと説明している入門書があるならクソ本)
&a[0] を a と省略出来るだけ
もちろん sizeof p と sizeof a[0] と sizeof a は違う
char *p = a;
は別物(同じだと説明している入門書があるならクソ本)
&a[0] を a と省略出来るだけ
もちろん sizeof p と sizeof a[0] と sizeof a は違う
140デフォルトの名無しさん (ワッチョイ bfe7-2qxF)
2023/11/30(木) 13:09:50.69ID:EuLMofdV0141はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/30(木) 14:54:30.13ID:3QI4e6Tt0 > &a[0] を a と省略出来るだけ
意味が同じなわけなので記法の上では省略と言えるんだけど
a が &a[0] のことを意味しているというわけではなく、
言語仕様上の理屈としては a のほうにプリミティブな定義があって &a[0] のほうが構文糖という扱い。
@ E1[E2] は (*((E1)+(E2))) と等価である
A & のオペランドが単項*演算子の結果の場合,*演算子も&演算子も評価せずに両演算子とも取り除いた場合と同じ
(添字演算子の適用結果をオペランドとする場合も同様)
B 配列 (結果が配列型となるような式) は sizeof か & のオペランドであるときを除いて先頭要素を指すポインタに変換される
つまり &a[0] の場合を順番に当てはめるとまず &*(a+0) と同等と見做され、
&* は無かったことにされるので a+0 となり、 0 を足しても内容は変化しないから無視できて a と同じ。
そして a は配列の先頭要素を指すポインタに変換される。
意味が同じなわけなので記法の上では省略と言えるんだけど
a が &a[0] のことを意味しているというわけではなく、
言語仕様上の理屈としては a のほうにプリミティブな定義があって &a[0] のほうが構文糖という扱い。
@ E1[E2] は (*((E1)+(E2))) と等価である
A & のオペランドが単項*演算子の結果の場合,*演算子も&演算子も評価せずに両演算子とも取り除いた場合と同じ
(添字演算子の適用結果をオペランドとする場合も同様)
B 配列 (結果が配列型となるような式) は sizeof か & のオペランドであるときを除いて先頭要素を指すポインタに変換される
つまり &a[0] の場合を順番に当てはめるとまず &*(a+0) と同等と見做され、
&* は無かったことにされるので a+0 となり、 0 を足しても内容は変化しないから無視できて a と同じ。
そして a は配列の先頭要素を指すポインタに変換される。
142はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/30(木) 14:59:53.10ID:3QI4e6Tt0 (順序から言うと配列がポインタに変換されるほうが先だな……。 すまぬ)
143はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/11/30(木) 15:08:15.57ID:3QI4e6Tt0 配列 a は a と書くだけで先頭要素を指すポインタなので
&a[0] と書くってのは 0 を足すという要らんことをしているという扱いってこと。
&a[0] と書くってのは 0 を足すという要らんことをしているという扱いってこと。
144デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
2023/11/30(木) 20:20:41.06ID:4nwqW1NG0 >>140
pがザビ家でaがジオン公国そのものと言ったら判りやすいだろうか
ジオンはザビ家にNTRれたけど元のジオン・ダイクンが掲げた思想(長さとか)はNTRが完了した時点で失われた
その後出てきたアクシズ(ネオ・ジオン)はもっと酷くてジオンと言える部分はNTRしたザビ家の跡取りとその傀儡だけでジオンとは一体何だったのか語れる人物は一人もいない
pがザビ家でaがジオン公国そのものと言ったら判りやすいだろうか
ジオンはザビ家にNTRれたけど元のジオン・ダイクンが掲げた思想(長さとか)はNTRが完了した時点で失われた
その後出てきたアクシズ(ネオ・ジオン)はもっと酷くてジオンと言える部分はNTRしたザビ家の跡取りとその傀儡だけでジオンとは一体何だったのか語れる人物は一人もいない
145デフォルトの名無しさん (ワッチョイ 47e7-xen6)
2023/11/30(木) 20:26:04.69ID:SvZ2/mZg0 >>143
そっちのほうが余計なギミックじゃない?
a[]のアドレスが欲しければ&aと書くだけでいいのに
aが自動的にa[]の先頭番地になってしまうからややこしい
ちなみにBASICだと配列と同名の単純変数が作れてしまいこれも今思うと無茶苦茶だった
そっちのほうが余計なギミックじゃない?
a[]のアドレスが欲しければ&aと書くだけでいいのに
aが自動的にa[]の先頭番地になってしまうからややこしい
ちなみにBASICだと配列と同名の単純変数が作れてしまいこれも今思うと無茶苦茶だった
146デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/30(木) 20:46:09.47ID:h/B+JtY5a >>117
意味無いわ
意味無いわ
147デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/30(木) 20:47:46.07ID:h/B+JtY5a 完全に理解した!!!
↓
https://ideone.com/g2912A
#include <stdio.h>
#define N 3
int main(int argc, char **argv)
{
char *hoge[] = {"abcd", "efg"};
char **hige = hoge;
char hage[][N] = {"ab", "cd", "ef", "gh"};
char (*fuga)[N] = hage;
char (*moga)[N] = {"ab", "cd", "ef", "gh"};
printf("%zd %s %s\n", sizeof(hoge), hoge[0], hoge[1]);
printf("%zd %s %s\n", sizeof(hige), hige[0], hige[1]);
printf("%zd %s %s %s %s\n", sizeof(hage), hage[0], hage[1], hage[2], hage[3]);
printf("%zd %s %s %s %s\n", sizeof(fuga), fuga[0], fuga[1], fuga[2], fuga[3]);
printf("%zd %s %s %s %s\n", sizeof(moga), moga[0], moga[1], moga[2], moga[3]);
return 0;
}
↓
説明してみ
↓
https://ideone.com/g2912A
#include <stdio.h>
#define N 3
int main(int argc, char **argv)
{
char *hoge[] = {"abcd", "efg"};
char **hige = hoge;
char hage[][N] = {"ab", "cd", "ef", "gh"};
char (*fuga)[N] = hage;
char (*moga)[N] = {"ab", "cd", "ef", "gh"};
printf("%zd %s %s\n", sizeof(hoge), hoge[0], hoge[1]);
printf("%zd %s %s\n", sizeof(hige), hige[0], hige[1]);
printf("%zd %s %s %s %s\n", sizeof(hage), hage[0], hage[1], hage[2], hage[3]);
printf("%zd %s %s %s %s\n", sizeof(fuga), fuga[0], fuga[1], fuga[2], fuga[3]);
printf("%zd %s %s %s %s\n", sizeof(moga), moga[0], moga[1], moga[2], moga[3]);
return 0;
}
↓
説明してみ
148デフォルトの名無しさん (アウアウウー Sa0b-6V65)
2023/11/30(木) 20:51:51.20ID:h/B+JtY5a アンカ忘れた
>>140
>>140
149はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-zy57)
2023/11/30(木) 21:26:27.48ID:3QI4e6Tt0150デフォルトの名無しさん (ワントンキン MM3f-XlNP)
2023/11/30(木) 22:06:24.41ID:wy49Mw9yM いやいや何を言っとんの?
利便性のためにそういう仕様にしてるんだよ
C書いてりゃさすがに分かんだろうよw
利便性のためにそういう仕様にしてるんだよ
C書いてりゃさすがに分かんだろうよw
151はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-zy57)
2023/11/30(木) 22:36:56.23ID:3QI4e6Tt0 感覚的にはそんなに不自然には感じないんだけど
仕様の規則が変則的なのも確かなので
つまりは人間の感覚は不合理なものってことだ。
仕様の規則が変則的なのも確かなので
つまりは人間の感覚は不合理なものってことだ。
152デフォルトの名無しさん (ワッチョイ bf5f-2qxF)
2023/11/30(木) 22:41:39.63ID:0Cr+jEwb0 >>147
%zd は知らなかったわ。 勉強になった
%zd は知らなかったわ。 勉強になった
153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/12/01(金) 00:42:09.23ID:U5xjJXbM0 sizeof の結果の型は size_t で、
size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど
unsigned int や unsigned long int の別名として定義されていることが多いせいで
それをあてにした形で説明している資料は割とある。
size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど
unsigned int や unsigned long int の別名として定義されていることが多いせいで
それをあてにした形で説明している資料は割とある。
154デフォルトの名無しさん (ワッチョイ 5fad-F3mB)
2023/12/01(金) 02:30:56.67ID:oKQshtme0 >>145
> a[]のアドレスが欲しければ&aと書くだけでいいのに
俺はそっちのほうがややこしいと思うけどな
むしろ*(a+10) を [] で表現するなら *a[10] みたいな書き方になるほうが、理解する上ではややこしくなかったかなとは思うけど(使う上では不便)
[] って箱(マス)に見えるし、まあ直接箱の中身を示すものなのだなって覚えたけど
> a[]のアドレスが欲しければ&aと書くだけでいいのに
俺はそっちのほうがややこしいと思うけどな
むしろ*(a+10) を [] で表現するなら *a[10] みたいな書き方になるほうが、理解する上ではややこしくなかったかなとは思うけど(使う上では不便)
[] って箱(マス)に見えるし、まあ直接箱の中身を示すものなのだなって覚えたけど
155デフォルトの名無しさん (ワッチョイ a76b-onFz)
2023/12/01(金) 05:52:03.14ID:sCbOzpGc0 誰が誰なのかよく分からんけど、キッズが来て荒れた、という話ですか
インデックスアドレッシングを [ ] 記号に当てただけと思うけど、そんなに難しいかね
インデックスアドレッシングを [ ] 記号に当てただけと思うけど、そんなに難しいかね
156デフォルトの名無しさん (ワッチョイ a76b-onFz)
2023/12/01(金) 05:55:20.08ID:sCbOzpGc0 型の話かと思ってたら、いつの間にか 入門者がポインタを理解できない話 になった印象
157はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/12/01(金) 14:51:35.53ID:U5xjJXbM0 >>145
配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。
(型が違う。 アドレスを数値として見たら同じはずだけど。)
多次元配列にアクセスするとき (添字演算子を重ねて適用するとき) に仕様の通りに解釈していくと配列と先頭要素が都合よく切り替わって最終的にポインタ演算になるのが実に上手いこと出来てる。
配列の要素にアクセスするときの記法を現状のような形にするという前提でならなんだかんだでよく出来ている。
配列に & を付けたら配列を指すポインタになるというのは例外的ではない普通の挙動だからそこに別の意味を割り当てるならそれもやっぱり変則的なややこしい挙動ってことになってしまうよ。
配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。
(型が違う。 アドレスを数値として見たら同じはずだけど。)
多次元配列にアクセスするとき (添字演算子を重ねて適用するとき) に仕様の通りに解釈していくと配列と先頭要素が都合よく切り替わって最終的にポインタ演算になるのが実に上手いこと出来てる。
配列の要素にアクセスするときの記法を現状のような形にするという前提でならなんだかんだでよく出来ている。
配列に & を付けたら配列を指すポインタになるというのは例外的ではない普通の挙動だからそこに別の意味を割り当てるならそれもやっぱり変則的なややこしい挙動ってことになってしまうよ。
158デフォルトの名無しさん (ワッチョイ 7f6a-l0Ve)
2023/12/01(金) 19:03:26.87ID:Ga+233FE0159はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
2023/12/01(金) 19:23:36.92ID:U5xjJXbM0 >>158
プログラマが直接的に書く機会はあんまりないだろうけど、
暗黙には頻繁に表れていてこのルールがないと上手いこと機能しないって話。
#include <stdio.h>
int main(void) {
int foo[2][3] = {
{1, 2, 3},
{4, 5, 6}};
printf("%d\n", foo[1][2]); // ふたつの座標みたいに見えるけど
// 式を各段階に分解すると……
int(*bar)[3] = foo; // 配列を指すポインタは出てきてる!
int *baz = bar[1];
int qux = baz[2];
printf("%d\n", qux);
}
プログラマが直接的に書く機会はあんまりないだろうけど、
暗黙には頻繁に表れていてこのルールがないと上手いこと機能しないって話。
#include <stdio.h>
int main(void) {
int foo[2][3] = {
{1, 2, 3},
{4, 5, 6}};
printf("%d\n", foo[1][2]); // ふたつの座標みたいに見えるけど
// 式を各段階に分解すると……
int(*bar)[3] = foo; // 配列を指すポインタは出てきてる!
int *baz = bar[1];
int qux = baz[2];
printf("%d\n", qux);
}
160デフォルトの名無しさん (ワッチョイ 65d3-WD8q)
2023/12/05(火) 07:30:58.43ID:72+QzLj/0 c言語初心者です
質問させてください
FILE *fpという宣言の「FILE」にどういった役割があるのでしょうか
*fpは関数によってどこを読み書きするかを指定するためにアドレスを格納することは分かるのですが
それならばint型のポインタで良いような気もします
プログラムを書く上でどうでもいい内容なのですが教えていただければ今日の寝付きが良くなる気がします
質問させてください
FILE *fpという宣言の「FILE」にどういった役割があるのでしょうか
*fpは関数によってどこを読み書きするかを指定するためにアドレスを格納することは分かるのですが
それならばint型のポインタで良いような気もします
プログラムを書く上でどうでもいい内容なのですが教えていただければ今日の寝付きが良くなる気がします
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- NY円、一時1ユーロ=180円台まで下落…1999年のユーロ導入以来初 [蚤の市★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 【外交】日中関係悪化、長期化の様相 2012年には自動車輸出80%減も ロイター★3 [1ゲットロボ★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 【実況】博衣こよりのえちえち朝こよ🧪 ★2
- 【実況】博衣こよりのえちえち朝こよ🧪
- カカロット、腰痛い
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 【!?】高市早苗「靖国神社電撃参拝プラン」浮上!これもう戦争だろ… [481941988]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
