X



C言語なら俺に聞け 155
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0952はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/19(土) 13:13:28.09ID:cxOsPIuF0
>>951
一応は >>949 も未定義だよ。
呼出規約が cdecl だったら余計な引数は捨てられるだけで問題にならないとは思うけど。

余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
より危険性がわかりやすいかな。

https://wandbox.org/permlink/1F876xK6UZ4wFjAA

余談だけど関数定義は宣言も兼ねるというルールにおいて、
K&R スタイルの関数定義はプロトタイプを持たない宣言でもあるという扱いだから
別途プロトタイプ宣言をする分にはエラーとして検出される。

https://wandbox.org/permlink/4n574f4R9yq0BzUj
0953デフォルトの名無しさん (ワッチョイ 7f28-5uLG)
垢版 |
2020/09/19(土) 14:57:40.15ID:Uw1s41Nc0
>>952
> 余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
たしかにその通りだな。

>>949 のコード例に気をとられて
もとの議論の内容を忘れてたw

thx
0956はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/21(月) 08:57:54.77ID:sulqQktu0
>>955
普通はする。 すべきだ。 というのがどれほどあてになるか。

普通はすることを (うっかり) しなかったら (エラーとして検出されずに) 通ってしまうってのは
K&R スタイルの関数定義はイケてないねって話。
0957はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/21(月) 08:59:37.43ID:sulqQktu0
K&R スタイルでなくともファイルを分割すると宣言と定義の矛盾が検出されなかったりもする。

// foo.c
void foo(int x) {
}

// foo.h
void foo(void);

// main.c
#include "foo.h"

int main(void) {
foo();
}

このとき foo.c をコンパイルするだけなら foo.h は不要だが
foo.c で foo.h をインクルードしておかないと間違いは検出できない。
0958デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 10:49:53.26ID:M8W5JifWF
linkエラーは?
0960デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 11:19:45.80ID:M8W5JifWF
実行時にスタック壊れたり
hangupしたりするんです?
0961はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/21(月) 12:59:37.93ID:sulqQktu0
>>958
C のオブジェクトファイルは名前しか保存しておらず、
型はヘッダファイルでやりとりするというのが伝統的なデザイン。
だからそれを一致させるのはプログラマの責任。

現代の実装技術なら検出できないことはないはずなんだが、
検出しないのは色々な都合があるんだろう。

>>960
cdecl や fastcall なら関数を呼び出すだけならスタックの整合性が壊れることはないと思うんだけど、
実引数と仮引数がまともに対応付けられていないわけだから
仮引数の読み書き (特に書き込んだとき) には壊れる可能性が高いんじゃないかな。
0962デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
垢版 |
2020/09/21(月) 17:40:26.50ID:PNFNM3Vd0
> 現代の実装技術なら検出できないことはないはずなんだが、

ちゃんとやってるよ
外部参照名の長さの上限を増やすという
後方互換性を損なわない賢いやり方で

それの恩恵を有り難く頂戴しているのがC++
0963デフォルトの名無しさん (ドコグロ MMdf-RDjc)
垢版 |
2020/09/21(月) 20:06:59.96ID:CAa9Vr4hM
意味わからん
マンダリングしてるC処理系なんてあったっけ?
別にオブジェクトコードに含ませなくてもデバッグ情報に含ませといてチェックするとかでも良いと思うけどね
0966デフォルトの名無しさん (ワッチョイ 9f47-SP/v)
垢版 |
2020/09/22(火) 02:46:33.89ID:EwzeVKsQ0
本人が間違ってる分には無視すれば良いだけだが
初心者スレで嘘を撒き散らすのは良くないな
0967デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 09:19:28.05ID:73EWHT9ca
volatileオブジェクトへのアクセスは副作用を生じるというのを見たことがあるのですが
この場合の副作用とは具体的にはどういう事象のことを言っているのでしょうか?
0970デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 12:21:55.75ID:73EWHT9ca
>>968
レジスタなどにアクセスする際に最適化で誤動作しないようにvolatileを付けるのかなと思ったのですが、
逆にvolatileを付けることによる不都合(副作用)って何かあるのでしょうか
それとも最適化されないことを副作用と読んでいるのでしょうか

>>969
最適化しないことによる処理時間増加でしょうか
0973デフォルトの名無しさん (ワッチョイ 177f-PS54)
垢版 |
2020/09/22(火) 12:48:41.23ID:fNKq19I/0
>>970
プログラミングの世界の副作用とは、不都合とかそんな意味ではなくて、内部状態が変更されるとか、外に何らかの影響を与えるとかそんな意味だよ。

例えばisalpha関数は文字の判定をするだけだけど、printfはコンソールに文字を出力する。
前者は副作用なし、後者は副作用ありだね。

volatileの件はそれが書かれた前後のコンテキストが分からないから何を指してるのか何とも分からんけど、たぶん、>>968に書かれてるように、外部デバイスへの作用のことを指してるんじゃないかな
0974デフォルトの名無しさん (ワッチョイ bfe9-Cup9)
垢版 |
2020/09/22(火) 13:01:07.61ID:GaogVwml0
>>970
副作用 (プログラム)
https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。

C言語における定義はこんな感じ。
http://kikakurui.com/x3/X3010-2003-01.html#13
> ボラタイルオブジェクトへのアクセス,オブジェクトの変更,ファイルの変更,又はこれらのいずれか
> の操作を行う関数の呼出しは,すべて副作用(side effect)と呼び(11),実行環境の状態に変化を生じる。
0975967 (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 17:15:02.44ID:73EWHT9ca
回答ありがとうございました
組み込みの資料か何かでvolatileの副作用についての記述があり質問させていただきました
副作用の意味がいまいち分かってないみたいなので勉強します
0980デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 07:00:27.18ID:BXhKM0Xn0
数値リテラル「0」の型は何ですか?

int* p = 0; // これはOK
int* p = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外?
int* p = (unsigned int)0; // これもエラーで無理。
printf("%zu", sizeof(0)); // 0の型のサイズを調べると4byteと表示される。
この数値リテラルの「0」の型は何ですか?
ちなみに、まだC言語環境を構築してないから、代わりVisualC++を使ってるけど、他の環境でも起きますか?
0981デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 07:30:53.01ID:BXhKM0Xn0
さらに調べると・・・・
キャスト演算子で型を指定した0は、代入の際にint*型へ変換してくれない。
接尾語を付けて型を指定した0は、代入の際にint*型に変換してくれる。

int* p = (long int)0; // NG
int* p = 0L; // OK

int* p = (unsigned int)0; // NG
int* p = 0u; // OK

キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
0982デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
2020/09/28(月) 07:54:15.67ID:QxfbhGyV0
>>980
intだよ

D:\learn>gcc --version
gcc (Rev2, Built by MSYS2 project) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\learn>gcc 980.c

D:\learn>gcc 980.c -pedantic -Wall
980.c: In function 'main':
980.c:9:10: warning: unused variable 'p3' [-Wunused-variable]
9 | int* p3 = (unsigned int)0; //
| ^~
980.c:8:10: warning: unused variable 'p2' [-Wunused-variable]
8 | int* p2 = (int)0; // ntintnt*nt
| ^~
980.c:7:10: warning: unused variable 'p1' [-Wunused-variable]
7 | int* p1 = 0; // K
| ^~

-Wallにするとunusedって警告でるけど型の話じゃないね
0983デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
2020/09/28(月) 08:00:54.96ID:QxfbhGyV0
>>981
D:\learn>cl 980.c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.27.29111 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

980.c
980.c(8): warning C4047: '初期化中': 間接参照のレベルが 'int *' と 'int' で異なっています。
980.c(9): warning C4189: 'p3': ローカル変数が初期化されましたが、参照されていません
980.c(7): warning C4189: 'p1': ローカル変数が初期化されましたが、参照されていません
980.c(8): warning C4189: 'p2': ローカル変数が初期化されましたが、参照されていません
Microsoft (R) Incremental Linker Version 14.27.29111.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:980.exe
980.obj

参照されていませんという警告は型の話ではないのでここではスルー
型についての警告が出ている8行目とやらはこれ
> int* p2 = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外?

隣の9行目は警告されていない(しかも/W4で)
> int* p3 = (unsigned int)0; // これもエラーで無理。

おそらくclが警告しているのはXXX*とXXXでポインタの間接段数を間違えたんだろうということ
これなら9行目はXXX*とYYYで間接段数の問題ではないので黙っているという説明がつく
0985デフォルトの名無しさん (ワッチョイ 1ee9-b+lb)
垢版 |
2020/09/28(月) 08:46:40.00ID:IwymMB/J0
>>980
0 の型は int だけど、空ポインタ定数 "null pointer constant" なので、すべてのポインタ型への暗黙変換が効く。
http://kikakurui.com/x3/X3010-2003-01.html#39
> 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant)と呼ぶ。

(int)0 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
0990デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 10:10:46.96ID:BXhKM0Xn0
>>982
むつかしくてわからないのでひらがなでおねがいします


>>985
こんな感じで理解しておけばいいですか?

・整数定数式としての「0」とは、ソースコードに直接書かれた「0」で、評価されて返ってきた「(int)0 ⇒ 0」や「4 - 4 ⇒ 0」などの「0」は整数定数式とは言わない。
・同じ0でも、void*型の「0」や、整数定数式としての「0」だけを空ポインタ定数と呼び、空ポインタ定数は代入の際にポインタ型へ暗黙変換できる。
よって
int* p = (int)0; // 「(int)0」が評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。
int* p = 4-4; // 同様に、評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。
int* p = 0; // 定数式としての「0」だから代入OK

型と値が一緒の、同じint型の「0」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
0991デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
2020/09/28(月) 10:24:28.53ID:QxfbhGyV0
>>990
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
0992デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 10:34:20.53ID:BXhKM0Xn0
>>991
ひらがなでわかりやすくせつめいしてくださったので
あたまのわるいわたしでもようやくわかりました
ありがとうございます
0994デフォルトの名無しさん (エムゾネ FF32-0ian)
垢版 |
2020/09/28(月) 11:51:34.94ID:PXJ7xAyjF
NULL == 0 // true

ちなみに0は8進数な
0996デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
2020/09/28(月) 13:16:35.37ID:QxfbhGyV0
いや8進数だよ
0xで始まったら16進数
0で始まったら8進数

こんな関数作って見たらわかるよ
syukudai("210") == 210
syukudai("110") == 110
syukudai("010") == 8
syukudai("0x10") == 16
0997デフォルトの名無しさん (ワッチョイ 92a5-6ZJT)
垢版 |
2020/09/28(月) 13:27:42.04ID:zovFJ8Ky0
次スレは
0999デフォルトの名無しさん (ワッチョイ 6b4e-gvfU)
垢版 |
2020/09/28(月) 14:46:36.10ID:MwxSOqxv0
質問いいですか?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 140日 15時間 37分 31秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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