C言語なら俺に聞け 150

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウクー MM57-IE4z)
垢版 |
2019/02/06(水) 13:39:03.21ID:c4bnQMl3M

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.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言語なら俺に聞け 149
https://mevius.5ch.net/test/read.cgi/tech/1540731704/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/03/11(月) 07:55:55.31ID:yg4bOGVFd
>>710
ごめん>>705だった
2019/03/11(月) 08:13:44.57ID:7fkCOxJ/a
>>708

>個人的には>>699 の「int a = 3; の = は代入演算子か違うものか」

宣言での=は、初期化宣言子内の区切り子

>「int* は型か、型ではない(int型に*を作用させた何か)か」
>「ポインタ変数を宣言する際の * は演算子か演算子ではない何かか」
>「変数宣言の * が演算子でないなら何と呼ぶのか」

宣言での*は演算子ではなく、ポインタ宣言子の区切り子

6.7.5.1
ポインタ宣言子 
意味規則
宣言
T D1
において,D1 が形式
                * 型修飾子並びopt D
をもつ場合,次のとおりとする。
宣言
T D の ident
に対して指定される型が Tの派生宣言子型並び
であれば, T D1の ident に対して指定される型は
Tへの型修飾子並びをもつポインタの派生宣言子型並びとする。
2019/03/11(月) 08:13:54.01ID:U6Vr66LT0
>>707
お前さんが型と呼びたいものはC言語では基本型であって、C言語における型の一部でしかない。
>>707が挙げてくれている通り、基本型と、再帰的に定義される派生型を合わせてすべて型と見なされる。
この定義によって、どんな型をどんな順序で組み合わせようと、ポインタが何段あろうと、どんな名前をつけられようと、定義に再帰的に合致させられるそれらすべてを型と見なせるとあらかじめ定義されている。
2019/03/11(月) 08:29:24.73ID:7fkCOxJ/a
>>713
宣言時の型の話です、元々
int*p;
のint*は型かどうかと言う話です。宣言した結果pの型がint*型に・・
あ、int*は型指定子か、と言えばよかったのかな?
2019/03/11(月) 08:34:48.95ID:m5MHROJsd
逆に「int* 」が型じゃないって考えの人は
int* a
のaの型は何って聞かれたときにどう答えるのか知りたい。
2019/03/11(月) 08:59:57.45ID:+tgFX8Zg0
>>712
「初期化宣言子内の区切り子」っていう言葉がヒントになった。ありがとう。
n1570.pdf (>>1 のリンク参照) 6.7.9 に載ってるね。
英語だから、すらすら読めるわけじゃないけど。

スカラの算術型に関しては「{} で囲んだ初期値を入れられる」
(構造体の初期化と同じ書き方ができる)ってのが代入演算子と違うところかな。
int a = {3}; // 「定義と同時の初期化」では許される
int b;
b = {4}; // エラー: 通常の代入演算子では値を {} で囲めない

だからどうした、って話かも知れないけど、
動作の違いが確かに存在するってのは気分的にすっきりするわ。
2019/03/11(月) 09:18:31.95ID:7fkCOxJ/a
>>715
ごめんなさい、int*は型指定子かどうかと言うべきでした。

int*a;
aはなにか、と聞かれるとintへのポインタと答えます。

aの型はなにか、と聞かれるとint*型と答えます。

宣言でのint*の文字の並びは型か、と聞かれると宣言でのint*と言う文字の並びは型指定子intと、ポインタ宣言子の並びであって、結果int*型となるがint*型の指定子ではない、と答えます。
2019/03/11(月) 09:28:25.09ID:7fkCOxJ/a
みなさんごめんなさい、私が型指定子とはっきり言わなかったせいで混乱を招いてしまいました。

あ、その前に、
int*p;
のint*は型指定子じゃありませんよね?私の理解合っていますか?
2019/03/11(月) 10:41:18.26ID:jULKzJ5ia
オブジェクトにもちろん型はあるけど、Cで「型指定子」なんてもんを明確化することに大した意味があるとは思えんね
2019/03/11(月) 10:49:48.10ID:jULKzJ5ia
typeof使うと左と右にはっきり分けて書けるので、好きな人は好きだろう。
typeof(int (*)(void *, char []) hogeobj;
2019/03/11(月) 10:50:24.51ID:rOT48PNA0
>>707
713も言っているように、おまえさん用語の意味を誤解してるんだよ
型は基本型の他に派生型も含まれる用語だ

それから定義の意味もおまえさんおかしいぞ
定義は宣言のうち重複できないものをいう
キーワードは定義できない
2019/03/11(月) 13:08:41.49ID:7fkCOxJ/a
>>721
はい、気をつけます。

>>719
>>1のc99 6.7の構文規則でいうと
宣言:
宣言指定子列    初期化宣言子並び opt;
宣言指定子列:
記憶域クラス指定子    宣言指定子列 opt
型指定子    宣言指定子列 opt
型修飾子    宣言指定子列 opt
関数指定子    宣言指定子列 opt
初期化宣言子並び:
初期化宣言子
初期化宣言子並び    ,    初期化宣言子
初期化宣言子:
宣言子
宣言子    =    初期化子

ですから、
int *a,b,c,*d;
という書き方は
宣言指定子列と初期化宣言子並びなのですけど
int*が型指定子だとすると、
宣言指定子列の型指定子がint*、
以降の a,b,c,*d;は初期化宣言子ですから、a,b,c,*dのどれもがint*型になると思うのです。

int*は型指定子ではないから
aはint*,bはint,cはint,dはint*になりますよね。

型指定子かどうかは重要じゃありませんか?
2019/03/11(月) 18:41:02.08ID:m5MHROJsd
>>717
ありがとう。話のレベルが高くて自分にはもはや質問しかできないが…
724デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 14:43:07.78ID:3xf7Y18W0
for文とif文を使って整数nを入力して、2つの1以上10以下の整数x,y(x>=y)の自乗の和がn(n=x^2+y^2)になるx,yとなる組み合わせを求める(n=45のときx=6,y=3みたいな )C言語のプログラムを作りたいんですが、関数って使いますか?
2019/03/12(火) 14:49:14.15ID:tBEUjULM0
>>724
使いますよ。
726デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 15:08:06.95ID:M/w6PjEFa
宿題は宿題スレがあるのでそちらへ
727デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:29:14.81ID:3xf7Y18W0
>>725
分かりました、ありがとうございます。
>>726
どのスレのことか分からないのでそのスレの名前を教えて頂けるとありがたいです。
2019/03/12(火) 15:30:39.97ID:tBEUjULM0
>>727
「宿題」で検索するくらいのことはしろよ……
729デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:50:57.05ID:3xf7Y18W0
>>728
検索した上で分からなかったので聞いています
2019/03/12(火) 15:54:56.93ID:aH0w6D4n0
宿題スレって、回答の丸投げだろう
質問に応えるスレではない
2019/03/12(火) 16:35:11.23ID:ZZbwvg6D0
宿題スレ見てきたけど過疎って誰も居なさそうだったけど・・・
2019/03/12(火) 16:37:57.47ID:aH0w6D4n0
依頼があればやってくれるだろう
それ以外に話題がないスレだし
2019/03/12(火) 17:32:47.14ID:1t7NN+JI0
「宿題」はこの辺かのう。
設立も古いし、何ヶ月も投稿ないから沈んでるのかな。
通常のインターフェースで一覧を見ないんで正確には分からんが。

C/C++の宿題片付けます 170代目
http://mevius.2ch.net/test/read.cgi/tech/1456911928/

C/C++の宿題片付けます 170代目
http://mevius.2ch.net/test/read.cgi/tech/1456647534/


こんなの↓も見つけたけど、これは「宿題」では見つからないタイトルだね。
【C】至急課題のプログラム教えて【アマギフ】
http://mevius.2ch.net/test/read.cgi/tech/1551308087/
2019/03/12(火) 17:44:27.56ID:f4lS/kh70
>>724
その目的を直接的に達成する標準関数はない
自乗を求める標準関数ならpowというのがあるが
整数を前提とするその問題には適さない
処理の一部を、おまえさんが関数にする可能性ならある

おまえさん、プログラムを作ってくれなんて言ってないよな
変な妄想してるバカは無視していいぞ
2019/03/12(火) 17:52:53.77ID:u0RxZCyHr
入力と表示に標準関数は使うんじゃねって程度かな?
736デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 18:17:50.08ID:M/w6PjEFa
>>729
何でわからないんだよ。どういう環境で使ってるんだ?
737デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:18:02.86ID:3xf7Y18W0
明日テストでその過去問にこのような問題が出て、関数が必要なら諦めようかなと思って質問しました。
スレチだったならすみません。答えてくださってありがとうございました。
738デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:21:35.85ID:3xf7Y18W0
>>736
スマホで専ブラ使ってます。予測はつきましたが、過疎っていたのでそのスレで合っているのか疑心暗鬼でした。今はどのスレのことか分かっています。
2019/03/12(火) 18:26:45.91ID:aH0w6D4n0
ここで聞いて良いよ
2019/03/12(火) 18:34:45.08ID:UkyVoLmHd
>>724
これはifとforの練習問題以外の何者でもなさそうだ。便利な関数使って解いたりしたら先生が泣いちゃいそうw
741デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:41:24.28ID:3xf7Y18W0
>>739
ありがとうございます!このような問題です。

for文とif文を使って整数nを入力して、2つの1以上10以下の整数x,y(x>=y)の自乗の和がn(n=x^2+y^2)になるx,yとなる組み合わせを求める(実行例:n=45のときx=6,y=3)C言語のプログラムを作成せよ。そのような組み合わせがない時は、nothingと表示せよ。
2019/03/12(火) 18:44:54.25ID:u0RxZCyHr
答えのプログラムが欲しいの?
2019/03/12(火) 18:50:45.53ID:1jGqQ8ze0
候補絞り込みの最短手順を求めるような問題でも無さそうだし力技の総当たり探索で良いんじゃないの?
744デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:53:51.90ID:3xf7Y18W0
>>742
答えのプログラムが欲しいです。
2019/03/12(火) 19:00:24.48ID:WBGLmq+B0
>>744
宿題スレに書いてここに書いた場所を報告すれば、問題を解くプログラムを私が書きましょう
2019/03/12(火) 19:25:13.04ID:i1gu3hXZ0
>>744
この程度のプラグラムを自力で解こうとする気が無いなら素直に落第しておけ
747デフォルトの名無しさん (ワッチョイ 7705-k7ao)
垢版 |
2019/03/12(火) 19:36:11.90ID:3xf7Y18W0
>>745
C/C++の宿題片付けます 170代目
https://mevius.5ch.net/test/read.cgi/tech/1456911928/

このスレに問題書き込みました。29番目のコメントです。
2019/03/12(火) 20:13:37.41ID:fue8lGKw0
なんかヤバイ奴で草
2019/03/12(火) 20:37:17.45ID:OWFMR/J/0
ただの全探索じゃん…
750デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 20:55:37.42ID:M/w6PjEFa
いいんじゃないの?恐らく数学的になんとかしようとするとコンピュータ使わずに解が出て終わってしまうだろうし。
2019/03/12(火) 21:33:45.13ID:fue8lGKw0
>>750
??
752デフォルトの名無しさん (ササクッテロ Spc7-OS7W)
垢版 |
2019/03/12(火) 21:37:28.98ID:foIxPF9Op
もう取り繕う理由ないからタメ語で話すけど
簡単な問題に関してめっちゃレスしてしまってすまんな
明日のテスト頑張ってくるわ
説明してくれた人皆ありがとノシ
2019/03/13(水) 10:38:00.71ID:qAReO6hg0
>>752
手を煩わせたんだから 良かれ悪かれちゃんと結果報告には来いよな
幸運を祈ってやる
2019/03/13(水) 15:02:14.09ID:NOmoz09Zp
>>753
ありがとう
さっきテスト終わったけど微妙だった
合格の可能性ワンチャンあるけど、期待はしない方がいい
多分来週に結果が分かると思う、遅くても今月以内
結果が分かった時に報告する
2019/03/13(水) 18:27:05.40ID:Gm1xMrEed
>>754
テストに落ちたらどうなってしまうんや……
2019/03/13(水) 21:09:52.65ID:STGkCaiX0
課題を出されましたが、全くわかりません
このプログラムを作っていただけませんか?
スレ違いなら誘導をお願い致します


@キーボードから任意の文字を入力します。
A先頭が数値の場合
 ・入力を数値に変換して、メモリーに格納します。
 ・格納されている全ての数値を降順(大きい方が先頭)に並び替えます。
B先頭が数値でなければ、現在入力されている数値を並び順の逆順で全て表示する。

尚、数値は100個以上格納できるものとします。
2019/03/13(水) 21:26:02.50ID:P84Y9tDKa
>>756
少し遡れば宿題スレのリンクがある
2019/03/14(木) 06:00:16.00ID:SGfhnH0M0
>>756 宿題スレッドへのリンクは >>733 な。今のところまだ有効。

携帯端末(小さい画面)のせいか、スレッドを遡って読むのが難しい人の
質問が増えたようだけど、そういう閲覧環境だと、質問に対する回答の
ソースリストを読むのも一苦労な気がするなぁ。
2019/03/14(木) 06:58:22.51ID:6NSPfC1dd
>>757>>758
誘導ありがとうございます
上のスレの方に行きます
2019/03/16(土) 19:25:45.05ID:QzqNYN9X0
>>758
ソースを何らかの方法で PNG なり JPEG なり GIF なり
2019/03/17(日) 00:34:59.62ID:dzL2D1Cha
Cはじめましたよろしくです。これみてやってください

FILE *fp;
char *p;
char fname[100];
char str[500];

gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);

while(p != NULL){
printf("%s", str);
p = fgets(str, 500, fp);
 }
 
とやって難なくファイル表示してくれましたが、これpはしょれんじゃね?と思ってこうしてみましたの

gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);      とりあえず放置

while(str != NULL){       p→strに書き換え
printf("%s", str);
//p = fgets(str, 500, fp);   コメ停止
    fgets(str, 500, fp);      こうしてみた
 }

すると
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・っと無限に続いて
2019/03/17(日) 00:35:16.47ID:dzL2D1Cha
なんで止まらないんでしょ?
2019/03/17(日) 00:37:54.05ID:aA4z/LNt0
>>761-762
str が NULL になることは無いので。
配列として確保した str の「場所」は中身が何であろうと同じ場所にある。
2019/03/17(日) 00:43:34.56ID:dzL2D1Cha
>>763
もすこしだけおしえてください
fgetがfpに指定したというか登録したファイルから指定数読み込んで、それをpに渡して…
このときに文字終端ならpにNULLも渡ってそれでwhileの条件に合致して止まると思いまして ←ここまであってますか?

なら、pに渡さんでもfgetsが読みに行ったときにもう読む行ないならNULLも引っさげて帰ってくるからstrにNULLがはいってて
じゃーああいうふうに掛けばpいらねんじゃね?と思ったんですがなぜこれだとNULLはいってないんでしょ
2019/03/17(日) 00:48:28.87ID:hO+9vtK70
printf("%s", str);
memset(str, 0, sizeof(str));←これ入れてみ
fgets(str, 500, fp);

どうしてかは、自分で考える
2019/03/17(日) 00:50:56.68ID:aA4z/LNt0
>>764
str が「どこにあるか」と「何が入っているか」は別物。
NULL と比較するのは「どこにあるか」であって、中身とは関係ない。
何度ループしても str の場所は同じなんだよ。
2019/03/17(日) 00:56:16.34ID:/bg4Vz3i0
配列名strは先頭要素のアドレス&str[0]と同じ
strの評価結果は常に同じアドレスを返す
配列が正常に確保されている限りNULLになることは無い
2019/03/17(日) 00:56:29.02ID:dzL2D1Cha
>>765
>>766
うぉあー 小一時間なやんできますありがとうございました!
2019/03/17(日) 00:57:37.07ID:dzL2D1Cha
>>767
NULLがなにかよくわかってないことがよくわかりましたw いってきます
2019/03/17(日) 01:47:18.69ID:rgOA/kAB0
>>764
fgets()は成功したら配列の場所を返す(つまりp == str)けど
失敗した場合はNULLを返す(つまりp == NULL)

ここで問題なのは他の人が言ってる通り「引数にとった配列の場所は変わってない」こと

char str[500];
っていうのは(今回はファイルから文字を読み込むために)char型のデータ領域を500個確保するってことで、
わざわざ取った場所を変更したり勝手に消したりはしない

対してNULLはまぁ何もない場所のアドレスって考えでとりあえずはいいと思う
だから、strの領域の(内容は変わってるかもしれないけど)場所はfgets()の結果がNULLでも確保してあるだけだから変わらない

最初の(動いた方の)プログラムで、fgets()した後に
printf("p=%p, str=%p\n", p, str);
とかやってアドレス表示させて途中と最後比べてみたら感覚的に分かるかも
2019/03/17(日) 04:30:49.94ID:SA4RHMx10
fgets の戻りは ポインタである必要は無く、int (bool) でいいと思うんだ
printf("%p\n", fgets()) のように直接重ねても、ファイルエンドでぬるぽ踏むわけだし
2019/03/17(日) 05:46:27.76ID:57obmdS/a
int返したらprintfに食わせられないじゃん
2019/03/17(日) 06:11:49.28ID:lbYyU/s40
そんなことしねえから大丈夫
2019/03/17(日) 15:32:50.89ID:aA4z/LNt0
暗黙の型変換で配列がポインタになるってのが諸悪の根源なんだよな。
まあそれでだいぶん書くのが楽という面もあるんだけど、
この手の思い違いが連発するのはやっぱりどこか良くない設計だったのかもなと
思わないでもない。
2019/03/17(日) 16:10:49.52ID:/bg4Vz3i0
配列名や関数名はアドレスを指しているというだけであって暗黙の型変換とは無関係
2019/03/17(日) 16:16:25.40ID:aA4z/LNt0
>>775
配列名は配列型を指すし、関数名は関数型。
それがアドレス (ポインタ) になるのは暗黙の型変換による。
2019/03/17(日) 16:36:25.05ID:/bg4Vz3i0
>>776
https://ideone.com/2hzQXi
2019/03/17(日) 16:51:58.33ID:aA4z/LNt0
>>777
int[10] が int* 型に型変換されたり、 void(void) が void(*)(void) になったりするという暗黙の型変換の結果だね。
2019/03/17(日) 17:12:17.93ID:/bg4Vz3i0
>>778
配列Array[]の型はint[]型であるけど、配列名Arrayの型はint*型(値は&Array[0])
関数Func()の型はvoid(*)(void)ではあるけど、関数名Funcの型はvoid*型
暗黙の型変換など関係なくポインタに代入出来る
2019/03/17(日) 17:24:35.69ID:VrxWLsvb0
配列と配列名を別物としているようだけど、それなら配列と配列名を暗黙変換しているわけだろう。
2019/03/17(日) 17:32:23.78ID:/bg4Vz3i0
配列Array[]と配列名Arrayは別のオブジェクト
配列名Arrayは配列の先頭要素のアドレス&Array[0]と同一オブジェクトの糖衣構文
2019/03/17(日) 17:47:18.78ID:aA4z/LNt0
>>781
それは明らかに間違った理解。
これ以上の説明はしないので仕様を読んで。
2019/03/17(日) 18:28:05.39ID:mpr7j0a20
結局何が正解なんだ
2019/03/17(日) 18:33:42.80ID:SA4RHMx10
sizeof の時に区別していない/区別できないのなら 糖衣構文でも納得できるんだがね
2019/03/17(日) 20:04:24.76ID:lW9CTxpwd
T型の配列は一部の例外を除き「配列の先頭の要素を指すT型へのポインタへと型変換される」(C11 6.3.2.1.3)
だから暗黙の型変換で間違いない
2019/03/17(日) 20:47:21.33ID:lbYyU/s40
>>774
左辺値変形が諸悪の根元だと?
じゃあ printf(&"Hello world"[0]); などと書かされるのが
おまえさんの望みなのか
2019/03/18(月) 01:00:19.91ID:YfgH0B4l0
>>786
繰返しになるけど、暗黙の型変換で書くのが楽になってるのは承知してるんだってば。
ただ、初心者が (時にはベテランでも) 変な理解をしがちな理由はこれだろうな
っていう意味での根源は暗黙の型変換にあるっしょ。
2019/03/18(月) 04:00:43.39ID:P9Yklj5Ga
おじゃまします
printf("[%s][%d][%p]\n", str, str, &str);

こう表示させたとき%sと%pに出る値は意味わかるのですが(文字列とアドレス)
はわかるのですが%dに出る数字の羅列はなにになるんですか
2019/03/18(月) 04:05:51.06ID:YfgH0B4l0
>>788
str は char の配列ということでいい?
だとするとアドレス。

str が配列であれば str と &str はアドレス値として見れば同じになるはず。
型は違うけど。
(整数への変換で何が起こるかは言語仕様でははっきりした規定は無い
ので、表現が変わってしまうことな無いとは言えない。)
2019/03/18(月) 04:51:21.12ID:P9Yklj5Ga
>>789
なるほど!
値が違ったのでアドレスじゃないのかと思いましたの
%dと%pではアドレスの表現が少し違うという解釈でよさげですね
いつもありがとうございます
2019/03/18(月) 06:31:42.89ID:YfgH0B4l0
>>790
表示が違うのは %p は16進表示になってるとかじゃない?
2019/03/18(月) 06:49:00.10ID:lirXey68a
単に%dだからアドレスの10進表記になると思ってだけど、はっきり決まってはなかったんだ。
2019/03/18(月) 07:14:51.68ID:/H01vbo60
>>787
そういう諸悪の根元なら左辺値変形ではなく
関数仮引数で空の角括弧を許していることだろうが
2019/03/18(月) 07:38:07.69ID:lirXey68a
まぁ、双方明示的に(個人の感想です)strとキャストすべきなんだろうな。
795デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/18(月) 14:12:42.17ID:1gtRswz3a
ポインタに対してprintf()で%d指定した時ってアドレスがちゃんと出るって保証されてたっけ?
2019/03/18(月) 14:15:34.40ID:BO4wFGSe0
voidのポインタの便利さに気づきました
こんな私に何かアドバイスはありますか?
2019/03/18(月) 14:23:43.30ID:27d4/ixp0
次は汎用ポインタの不便さ面倒臭さに気付きましょう
2019/03/18(月) 14:23:54.47ID:mCQ8i9jz0
横質問で申し訳ない


NULL の実際の値
'\0' の実際の値

は実装依存ということで間違いない???
2019/03/18(月) 14:29:25.93ID:xzOI+WOH0
>>798
はい、間違いはございません
2019/03/18(月) 14:46:34.54ID:O3z3BOLxa
'a' の実際の値は決まってるとでもいうのか
2019/03/18(月) 14:57:23.82ID:YfgH0B4l0
>>795
保証されていない。
というより、値がアドレスには違いないのだけど
その表現がどうなっているか未定義なので、
意味のある値なのかどうかはわからない。
(常識的にはデタラメな値ということもないだろうけど……)

整数とポインタの関係について確実に保証されているのは、
ポインタをポインタのサイズより大きい整数型に入れたなら、
元の型にキャストしなおすと変換前と等しいってことくらい。
2019/03/18(月) 14:59:53.22ID:mCQ8i9jz0
>>799
即レス感謝です
2019/03/18(月) 15:01:51.19ID:mCQ8i9jz0
>>800
実装として、ASCIIとEBICDIC以外で「これは認識してないとダメ」なものがあれば御教示くださいませんか?
2019/03/18(月) 15:50:43.53ID:h9s8r5rIa
一部の文字が示す値の連続性の保証があったような
2019/03/18(月) 15:56:04.05ID:YfgH0B4l0
>>804
数字 ('0'〜'9') に対応する文字コードが連続する保証は有る。
2019/03/18(月) 16:33:31.22ID:CWr9PpIQ0
'0' 〜 '9' で挟んで '0' で引き算するのは保障されてるので成立するけど
'a' 〜 'f' , 'A' 〜 'F' で挟んで - 'a' + 10 や - 'A' + 10 は保障外のコードになる と。
2019/03/18(月) 17:09:05.92ID:yKiI4G/I0
>>801
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ

先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
2019/03/18(月) 17:42:10.10ID:mCQ8i9jz0
>>807
「処理系が必ず定義しなければならない」
「純粋に処理系依存なので、規格としては何も触れない」

この違いがイマイチ良く分からんのですが
2019/03/18(月) 17:56:16.31ID:1YRHAy75a
>>803
ないです
都度確認すればいい
2019/03/18(月) 21:11:30.38ID:yKiI4G/I0
>>808

> 「処理系が必ず定義しなければならない」
それが処理系定義
たとえば sizeof(int) が返す値だ

> 「純粋に処理系依存なので、規格としては何も触れない」
これは未規定
たとえば printf("%d %d", getchar(), getchar()); の場合の左右の getchar の実行順序だ

わかってないんなら、ちゃんと規格票で確認しとけ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況