!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
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言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 158
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ブーイモ MMcf-4SjH)
2021/12/25(土) 12:11:46.61ID:xxeaCAplM630デフォルトの名無しさん (ワッチョイ 1510-Rebr)
2022/06/09(木) 11:32:24.20ID:ZhHr/cTg0 >**
なんで char **argv が思い浮かばなかったかなぁ・・・。
なんで char **argv が思い浮かばなかったかなぁ・・・。
631デフォルトの名無しさん (ワッチョイ c6ae-+66E)
2022/06/09(木) 13:06:08.29ID:0WQEetb00 char *argv[]という初心者をいたぶる陰険な罠を避けたかったんじゃね?
632デフォルトの名無しさん (ワッチョイ a968-esN/)
2022/06/09(木) 15:57:22.96ID:lMNj+E1f0 GNU MakeよりCMakeが優れてるのはどの辺でしょうか?
633はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a3e-Rebr)
2022/06/09(木) 16:49:53.93ID:k8dtcEck0634デフォルトの名無しさん (ワッチョイ a968-esN/)
2022/06/09(木) 17:00:06.87ID:lMNj+E1f0 >>633
そうなんですね。ありがとうございます
そうなんですね。ありがとうございます
635デフォルトの名無しさん (ワッチョイ c602-nB9k)
2022/06/10(金) 11:33:59.29ID:rZTjX0hE0 宣言/デリファレンスの記法が悪いというより、=が悪い
両辺を等値(あるいはそうする=代入)というセマンティクスと解離してる
両辺を等値(あるいはそうする=代入)というセマンティクスと解離してる
636デフォルトの名無しさん (ワッチョイ c602-nB9k)
2022/06/10(金) 11:41:37.01ID:rZTjX0hE0 初期化の=は左辺ではなく、左辺で宣言されるものを指してるわけで、頭の中で=以外の記号に置き換えて読むといいかも
637デフォルトの名無しさん (ワッチョイ c6ae-+66E)
2022/06/10(金) 13:18:43.35ID:PT4Yy0z80 =と==は、はっきり区別されてるだろ
連動して常に等しいという規則ならマクロでやればいいし
連動して常に等しいという規則ならマクロでやればいいし
638デフォルトの名無しさん (ワッチョイ 1510-Rebr)
2022/06/10(金) 13:19:17.11ID:HL4tZsFs0 A=1
B=2
C=3
A=B=C
PRINT A,B,C
B=2
C=3
A=B=C
PRINT A,B,C
639デフォルトの名無しさん (ワッチョイ a969-lCJq)
2022/06/10(金) 16:02:05.50ID:5CLHXu7x0 >>638
BとCが等しいかの比較結果が A に入る
BとCが等しいかの比較結果が A に入る
640デフォルトの名無しさん (スッププ Sdea-maWv)
2022/06/10(金) 22:32:37.38ID:ExBywScCd C言語ではA=B=C;でAとBにCの値が入るはずだが
641デフォルトの名無しさん (オッペケ Sr87-vhci)
2022/06/11(土) 02:33:23.42ID:yqb/24klr Cの比較は==だからね
642デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/11(土) 04:29:30.42ID:3J9oG0Sq0 BASICだろ
643デフォルトの名無しさん (スッップ Sd1f-7fB6)
2022/06/11(土) 08:08:56.72ID:5lUjqa1id なんのスレ
644デフォルトの名無しさん (ラクッペペ MM7f-pgzz)
2022/06/11(土) 08:27:12.87ID:TYekU7UkM C
A=1, B=1, C=1
BASIC
A=-1, B=1, C=1
A=1, B=1, C=1
BASIC
A=-1, B=1, C=1
645デフォルトの名無しさん (ワッチョイ 03ad-b0/F)
2022/06/11(土) 15:01:54.40ID:s3NqXqGx0 ちょー初心者
引数付きの関数で引数が空のときにも意味を持たせたい
nanntoka(char adress)なんて関数で
呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
null判定でいいんですか?
引数付きの関数で引数が空のときにも意味を持たせたい
nanntoka(char adress)なんて関数で
呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
null判定でいいんですか?
647デフォルトの名無しさん (ワッチョイ 03ad-b0/F)
2022/06/11(土) 15:15:18.40ID:s3NqXqGx0 だよねー
やっぱ数値は工夫のしようがないから無理なのかー
やー助かりました
やっぱ数値は工夫のしようがないから無理なのかー
やー助かりました
648デフォルトの名無しさん (ワッチョイ 0310-GGE9)
2022/06/11(土) 15:45:32.03ID:NTE9LoY80 C++なら出来るんだっけ。
649デフォルトの名無しさん (ワッチョイ 63d2-asUV)
2022/06/11(土) 15:48:15.36ID:nZnmEekY0 C++にはデフォルト引数があるし
オーバーロードもできる
Cでできるかは知らん
int f(const char*s = nullptr);
オーバーロードもできる
Cでできるかは知らん
int f(const char*s = nullptr);
650デフォルトの名無しさん (ワッチョイ cf46-IaEQ)
2022/06/11(土) 16:27:10.38ID:dptRvNRm0 普通にはできないからやるな
(1) printfみたいにやる方法
(2) __VA_ARGS__でやる方法
があるぞい
(1) printfみたいにやる方法
(2) __VA_ARGS__でやる方法
があるぞい
651デフォルトの名無しさん (ワッチョイ 2301-UmXv)
2022/06/11(土) 17:10:24.92ID:t7XDMYlk0 >>650
printfみたいな可変引数でも第一引数は必要なので純粋に引数なしってのはできなかったはず。
printfみたいな可変引数でも第一引数は必要なので純粋に引数なしってのはできなかったはず。
652デフォルトの名無しさん (アウアウウー Sa67-QAJi)
2022/06/11(土) 17:22:53.63ID:lqPwOW/ya _Genericとかみんな使う?
653デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/11(土) 17:28:25.28ID:YjAHf+RK0 printf(NULL);
悪魔の召喚
悪魔の召喚
654デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/12(日) 05:58:21.10ID:rhQkMiRe0 >>651
できるぞ
第一引数なしで可変引数にするときは
void func();
と、省略記号なしで宣言する
ただし言うまでもないが
func();
で呼び出したときの第一引数は不定なので
使い途はない
できるぞ
第一引数なしで可変引数にするときは
void func();
と、省略記号なしで宣言する
ただし言うまでもないが
func();
で呼び出したときの第一引数は不定なので
使い途はない
655デフォルトの名無しさん (スッップ Sd1f-7fB6)
2022/06/12(日) 07:27:33.25ID:Tbig4rXQd プロトタイプ省略すればなんでもできるw
656デフォルトの名無しさん (ワッチョイ ff01-MmlY)
2022/06/12(日) 08:41:18.11ID:LzXoNMHn0657デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/12(日) 15:51:07.84ID:rhQkMiRe0658はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-GGE9)
2022/06/12(日) 16:04:25.30ID:7muDz8Uq0659デフォルトの名無しさん (ワッチョイ ff01-MmlY)
2022/06/12(日) 16:07:16.41ID:LzXoNMHn0660デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/12(日) 16:17:07.73ID:2T6Ast9Ed661デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 06:48:01.95ID:BOW2YZM80662デフォルトの名無しさん (スップ Sd1f-asUV)
2022/06/13(月) 08:40:16.72ID:si/cekt2d int func(void); と
int func(...); に対する言及なしで
int func(); だけ出てきてるからまともな議論じゃないと思ってスルーしてたが
可変引数は >>651 で出てきてそれに合わせてるだけじゃねーの?
int func(...); に対する言及なしで
int func(); だけ出てきてるからまともな議論じゃないと思ってスルーしてたが
可変引数は >>651 で出てきてそれに合わせてるだけじゃねーの?
663デフォルトの名無しさん (スップ Sd1f-asUV)
2022/06/13(月) 08:54:28.35ID:si/cekt2d int func(void); だとそもそも引数なししか受け付けない。
int func(...); だと引数の型と個数を実装側が期待するものにしなければならない。間違えたら未定義動作。
int func(); だと引数の型がわからないまま関数を使う。間違えてたら未定義動作。
int func(...); の第1引数は普通は型を明示するから
int func(const char*, ...); のようになるが。
int func(...); だと引数の型と個数を実装側が期待するものにしなければならない。間違えたら未定義動作。
int func(); だと引数の型がわからないまま関数を使う。間違えてたら未定義動作。
int func(...); の第1引数は普通は型を明示するから
int func(const char*, ...); のようになるが。
664はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-GGE9)
2022/06/13(月) 09:33:56.73ID:zy+KupId0 >>661
いいえ。 一致しない引数で関数を呼出そうとすることが未定義です。
いいえ。 一致しない引数で関数を呼出そうとすることが未定義です。
665デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 10:21:00.47ID:BOW2YZM80666はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-GGE9)
2022/06/13(月) 10:32:48.37ID:zy+KupId0667デフォルトの名無しさん (オッペケ Sr87-bFL4)
2022/06/13(月) 11:04:47.60ID:YiPaBYDZr 可変長引数では無理なのね
>>650の(2)の実装だとどうなるの
>>650の(2)の実装だとどうなるの
668はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-GGE9)
2022/06/13(月) 11:30:06.51ID:zy+KupId0 マクロでコンパウンドリテラルを作ってから (その個数と共に) 渡すという方法が取れると思う。
受け取る関数の型は >>645 の通りではできないけど。
#include <stdio.h>
#define foo(...) bar(sizeof((char[]){0, __VA_ARGS__}), (char[]){0, __VA_ARGS__})
void bar(int n, char* args) {
if(n==1) {
printf("no argment.\n");
} else {
printf("argment is %c.\n", args[1]);
}
}
int main(void) {
foo('a');
foo();
}
受け取る関数の型は >>645 の通りではできないけど。
#include <stdio.h>
#define foo(...) bar(sizeof((char[]){0, __VA_ARGS__}), (char[]){0, __VA_ARGS__})
void bar(int n, char* args) {
if(n==1) {
printf("no argment.\n");
} else {
printf("argment is %c.\n", args[1]);
}
}
int main(void) {
foo('a');
foo();
}
669デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 11:35:06.46ID:BOW2YZM80 >>666
話が噛み合っていないな
引数の数も型も比べる相手がいないのに矛盾しようがない
そもそも関数原型を用意しましょうなんていうのはCにおいて後付けの推奨事項に過ぎない
既存のコードを否定するのは影響が大きすぎるからな
話が噛み合っていないな
引数の数も型も比べる相手がいないのに矛盾しようがない
そもそも関数原型を用意しましょうなんていうのはCにおいて後付けの推奨事項に過ぎない
既存のコードを否定するのは影響が大きすぎるからな
670デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/13(月) 11:47:54.04ID:ir4nxYTVd671デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 11:48:35.71ID:cwJzo4Jp0 fn(void)
fn(int)
こういう2種類の引数を許容したとして
呼ばれた側はどう区別したら良いんだろう
コンパイル時に、別関数にアサインしたらいいのかな
その場合は受け取る関数も二つ用意してやらないと行けないな
fn(int)
こういう2種類の引数を許容したとして
呼ばれた側はどう区別したら良いんだろう
コンパイル時に、別関数にアサインしたらいいのかな
その場合は受け取る関数も二つ用意してやらないと行けないな
672デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/13(月) 11:52:40.59ID:ir4nxYTVd 区別はできない
引数を見ようとしたら結果は不定になる
単なるバグだよ
引数を見ようとしたら結果は不定になる
単なるバグだよ
673デフォルトの名無しさん (ワッチョイ cf46-IaEQ)
2022/06/13(月) 12:04:59.49ID:63W4P7Hh0 (2)の想定はこれだった
https://wandbox.org/permlink/EidRL6a8uqiszn2m
これも引数0個のときは##__VA_ARGS__か__VA_OPT__が必要で
まずかったな
https://wandbox.org/permlink/EidRL6a8uqiszn2m
これも引数0個のときは##__VA_ARGS__か__VA_OPT__が必要で
まずかったな
674デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/13(月) 12:13:41.38ID:Bgq8kBxf0 >>669 関数定義とその呼び出しを比較するって書かれてるのに、きみが無視するから噛み合わないんだよ。
675デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 12:16:16.46ID:BOW2YZM80676デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 12:18:15.22ID:BOW2YZM80677デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/13(月) 12:27:06.91ID:Bgq8kBxf0 >>675 その例だけなら矛盾しないね。でも引数渡せないから>645のやりたかったことはできないよね。
678デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/13(月) 15:54:04.85ID:BOW2YZM80 >>677
引数が空のときにに意味を持たせるんだったな
void func() { puts("no arguments are given"); }
int main()
{
func();
}
# さっき言った「罠」がまだここにある
引数が空のときにに意味を持たせるんだったな
void func() { puts("no arguments are given"); }
int main()
{
func();
}
# さっき言った「罠」がまだここにある
679デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/13(月) 16:19:19.10ID:Bgq8kBxf0680デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 16:34:27.02ID:cwJzo4Jp0 nantoka()と呼び出した場合、
呼び出された関数は、
nanntoka(char adress)として
スタック上からadressを取り出そうとするが
ここにある値はNULLではなく、不定値(所謂ゴミ)
NULL判定で回避はできない
呼び出された関数は、
nanntoka(char adress)として
スタック上からadressを取り出そうとするが
ここにある値はNULLではなく、不定値(所謂ゴミ)
NULL判定で回避はできない
681デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/13(月) 16:37:54.51ID:ir4nxYTVd >>678
Once again, once again, you're on your own
Who's to blame? who's to blame? it's such a shame
No-one ever hears your name, or plays your game
Once again, once again, you're on your own
Who's to blame? who's to blame? it's such a shame
No-one ever hears your name, or plays your game
682デフォルトの名無しさん (アウアウウー Sa67-MmlY)
2022/06/13(月) 18:45:35.75ID:+5MOS3Faa683デフォルトの名無しさん (スッップ Sd1f-asUV)
2022/06/13(月) 18:53:43.72ID:HsopZ7m+d グローバル変数 int exists_adress; を介してやれば引数あり/なし のモードを未定義動作を回避しつつ設定できそう
実用性など皆無だが
実用性など皆無だが
684デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/13(月) 19:17:35.58ID:ir4nxYTVd >>682
読み出すまではできるだろ
戻りアドレスか関係ないレジスタの退避値が入っている
問題はここではエラーにならず次にこの値で何かしようとしたらクラッシュする可能性が高い
これは単にコンパイラを騙して原因がわかりにくいエラーを出す方法なだけ
全くなんの意味もない
読み出すまではできるだろ
戻りアドレスか関係ないレジスタの退避値が入っている
問題はここではエラーにならず次にこの値で何かしようとしたらクラッシュする可能性が高い
これは単にコンパイラを騙して原因がわかりにくいエラーを出す方法なだけ
全くなんの意味もない
685デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 19:21:03.88ID:cwJzo4Jp0 分からないなら、試して見れば良いのに
686デフォルトの名無しさん (アウアウウー Sa67-MmlY)
2022/06/13(月) 19:40:41.59ID:+5MOS3Faa687デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 19:46:28.66ID:cwJzo4Jp0 読み出さなければ、実行時エラーにならないだろう
なんで、なるの?
なんで、なるの?
688デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 19:48:48.04ID:cwJzo4Jp0 呼ばれた側の関数は、adressに入っている(はずの)値を使うんだぜ
コード吐かなければ、それこそコンパイラのバグになるぞ
コード吐かなければ、それこそコンパイラのバグになるぞ
689デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 19:52:23.50ID:cwJzo4Jp0 実際に呼び出すコードは、呼ばれた側の関数に実装されるが、
呼び出し側の引数セットありと、引数セット無しで、
違うコードが実行されたりするのか?
呼び出し側の引数セットありと、引数セット無しで、
違うコードが実行されたりするのか?
690デフォルトの名無しさん (ワッチョイ 2301-UmXv)
2022/06/13(月) 20:03:29.40ID:Q7R38T3J0 何が起こっても不思議ではない未定義派と、コンパイラ実装は実質こうなってる派で話が噛み合うはずがないと思うの。
691デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 20:05:01.34ID:cwJzo4Jp0 信仰と言うより、勘違いだろう
恥ずかしくて後に引けなくなった感じ
恥ずかしくて後に引けなくなった感じ
692デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 20:09:56.04ID:cwJzo4Jp0 引数セットするのは、呼び出し側
コンパイラが呼び出し側で引数がないと判定した結果、
気を利かせて呼び出さないコードを吐くって一体どういうことだろう
呼ばれた側は機械的にあるはずの引数にアクセスする
呼ばれる側はセットしてないなんて分からないからアクセスしてしまうぞ
コンパイラが呼び出し側で引数がないと判定した結果、
気を利かせて呼び出さないコードを吐くって一体どういうことだろう
呼ばれた側は機械的にあるはずの引数にアクセスする
呼ばれる側はセットしてないなんて分からないからアクセスしてしまうぞ
693デフォルトの名無しさん (オッペケ Sr87-bFL4)
2022/06/13(月) 20:10:29.53ID:8KDu5nutr >「罠」がある(キリッ
とかお寒いこと書いちゃうくらいだしよほど視野が狭くなってたんだろうなぁ
とかお寒いこと書いちゃうくらいだしよほど視野が狭くなってたんだろうなぁ
694デフォルトの名無しさん (アウアウウー Sa67-hiZJ)
2022/06/13(月) 20:15:33.10ID:iGSNe98na stdcall と cdecl の話か?
どっちにしても引数省略されたのかされてないのか呼ばれた方では判らん
C++なら省略の代わりにデフォルト引数入れたりマングリングしたり出来るが
Cではどうしようもない
どっちにしても引数省略されたのかされてないのか呼ばれた方では判らん
C++なら省略の代わりにデフォルト引数入れたりマングリングしたり出来るが
Cではどうしようもない
695デフォルトの名無しさん (ブーイモ MM27-Uj9G)
2022/06/13(月) 20:17:50.97ID:6K7aQgyCM >>693
コピペで使えそうだなw
コピペで使えそうだなw
696デフォルトの名無しさん (ワッチョイ ff01-MmlY)
2022/06/13(月) 21:42:41.32ID:PLcvpN2h0 >>688-689,691-692
コンパイルエラーとして全くコードを吐かないという事すら可能なのに何を言ってるんだよ...
今時未定義動作すら考慮して最適化したりしてる時代なんだぞw
https://qiita.com/kaityo256/items/d2677e178be0180482e8
コンパイルエラーとして全くコードを吐かないという事すら可能なのに何を言ってるんだよ...
今時未定義動作すら考慮して最適化したりしてる時代なんだぞw
https://qiita.com/kaityo256/items/d2677e178be0180482e8
697デフォルトの名無しさん (スップ Sd1f-7fB6)
2022/06/13(月) 21:44:17.84ID:ir4nxYTVd698デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 22:00:44.23ID:cwJzo4Jp0 ワーニング笑
699デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 22:05:19.85ID:cwJzo4Jp0 一体どこのコンパイラがコード吐かずに停止するんだよ
700デフォルトの名無しさん (ワッチョイ ff01-MmlY)
2022/06/13(月) 22:14:04.47ID:PLcvpN2h0701デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 22:42:16.41ID:cwJzo4Jp0 つまり実在しないコンパイラってことだな
702デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 22:44:07.87ID:cwJzo4Jp0 オレ以外、全員狂ってるって言ってるのと同じ
703デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/13(月) 22:44:55.56ID:cwJzo4Jp0 こいつと同じ職場でなくて良かった
704デフォルトの名無しさん (ワッチョイ 7f69-GGE9)
2022/06/13(月) 23:54:32.34ID:uF/nHRZy0 法解釈論「人殺しは違法であり罰される」
実運用論「証拠を完璧に隠滅できれば罰されない」
意固地になっちゃってるから何言っても無駄
実運用論「証拠を完璧に隠滅できれば罰されない」
意固地になっちゃってるから何言っても無駄
705デフォルトの名無しさん (オイコラミネオ MM47-Uj9G)
2022/06/14(火) 03:02:34.64ID:bOBoFDUrM 意固地になるとアスペチックになるのか
アスペチックだから意固地になりやすいのか
アスペチックだから意固地になりやすいのか
706デフォルトの名無しさん (ワッチョイ ff01-MmlY)
2022/06/14(火) 06:01:33.60ID:WigeF4Tr0 意固地もなにも未定義動作なんて規格の話なんだから実運用論とか言われてもねw
707デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/14(火) 06:16:24.48ID:XpDhKBGs0708デフォルトの名無しさん (ワッチョイ 03cf-zEfY)
2022/06/14(火) 07:36:21.84ID:/Eif446V0 自分で言った言葉に?みつく芸なんだろうか
709デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/14(火) 10:22:14.90ID:2fucKJss0 >>707
>654が言ってるのはどうせこんなのだろうと思ってた。
https://wandbox.org/permlink/aiZH8Ytc91RyQ7HL
#include <stdio.h>
void func();
int main() { func(); }
void func(int x) { printf("%d\n", x); }
>654が言ってるのはどうせこんなのだろうと思ってた。
https://wandbox.org/permlink/aiZH8Ytc91RyQ7HL
#include <stdio.h>
void func();
int main() { func(); }
void func(int x) { printf("%d\n", x); }
710デフォルトの名無しさん (ワッチョイ f369-Aiv4)
2022/06/14(火) 10:32:47.66ID:rBU/2bdp0 実体記述時と、宣言&呼び出し時とで、引数の型や個数の不一致
コンパイルが通るかもしれんけど、どう動くかわからないし
俺の環境ではこう動くからと、それを信じて採用するには怖すぎる
コンパイルが通るかもしれんけど、どう動くかわからないし
俺の環境ではこう動くからと、それを信じて採用するには怖すぎる
711デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/14(火) 10:33:48.55ID:XpDhKBGs0712デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/14(火) 10:44:32.74ID:2fucKJss0 >>711 え? 679 (ワッチョイ 835f-GGE9) だから答えたのに何でよくわからんイチャモンつけられてんの?
いやまぁ、予想通りで結論に異論無いならいいんだけどさ。
いやまぁ、予想通りで結論に異論無いならいいんだけどさ。
713デフォルトの名無しさん (ワッチョイ f369-Aiv4)
2022/06/14(火) 10:50:39.67ID:rBU/2bdp0 省略時のデフォルト引数と(マングリング等による)別実装
C以前の言語でもありそうだし前者は検討してそうなもんだけど見送ったなりの理由があるんだろうか
C以前の言語でもありそうだし前者は検討してそうなもんだけど見送ったなりの理由があるんだろうか
714デフォルトの名無しさん (ワッチョイ 835f-GGE9)
2022/06/14(火) 10:52:59.20ID:2fucKJss0 想定が合ってたということで改めて結論も明記しとくと、
>709 のプログラムが未定義動作を起こすのは不定な x の値を使用するからではなく、
func(int x) に対して引数の数が不正な関数呼び出し func() を行うからであって、
x の値を使用しない場合(例えば関数内を空にした場合など)ても未定義動作になる、という話ね。
>709 のプログラムが未定義動作を起こすのは不定な x の値を使用するからではなく、
func(int x) に対して引数の数が不正な関数呼び出し func() を行うからであって、
x の値を使用しない場合(例えば関数内を空にした場合など)ても未定義動作になる、という話ね。
715デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/14(火) 10:53:17.30ID:XpDhKBGs0 >>712
ほらな、やっぱり自分の手の内は晒さない
ほらな、やっぱり自分の手の内は晒さない
716デフォルトの名無しさん (ワッチョイ f369-Aiv4)
2022/06/14(火) 11:13:15.99ID:rBU/2bdp0 661の立場だと
void func(int x) { }
・・・・・
func();
は、記述のほうで x をリファレンスしてないからセーフで未定義には該当しないと読めるが
そいう主張なのかな
void func(int x) { }
・・・・・
func();
は、記述のほうで x をリファレンスしてないからセーフで未定義には該当しないと読めるが
そいう主張なのかな
717デフォルトの名無しさん (オッペケ Sr87-bFL4)
2022/06/14(火) 11:51:03.61ID:2oEiwFQbr 引っ込みつかなくなると大変だね
718デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/14(火) 12:19:58.97ID:zr4Ezotf0 単に使われない変数があるってだけだと思うが
719デフォルトの名無しさん (ワッチョイ ff01-NwEC)
2022/06/14(火) 12:58:48.08ID:WigeF4Tr0720デフォルトの名無しさん (ワッチョイ f369-Aiv4)
2022/06/14(火) 13:36:14.16ID:rBU/2bdp0 実装の話
関数側でスタックに詰まれた引数をクリーンアップする呼び出し規約(pascalcall や stdcall) だと
明後日に飛んでいくのか
関数側でスタックに詰まれた引数をクリーンアップする呼び出し規約(pascalcall や stdcall) だと
明後日に飛んでいくのか
721デフォルトの名無しさん (ワッチョイ ffad-L0LW)
2022/06/14(火) 19:11:20.40ID:DieH08Hx0 引き数の値で関数内の処理を分けるか普通に関数分ければいいやん
722デフォルトの名無しさん (ワンミングク MM9f-+bKn)
2022/06/14(火) 21:11:51.49ID:VPcVb+UNM 普通の人ならそうするが、
普通で無い方法が無いかを
いろいろ議論している
暇つぶしとも言う
普通で無い方法が無いかを
いろいろ議論している
暇つぶしとも言う
723デフォルトの名無しさん (ワッチョイ cfae-/e9c)
2022/06/14(火) 21:17:41.30ID:XpDhKBGs0 特定されない限りあらゆるケースを想定するからな
724デフォルトの名無しさん (ワッチョイ ffad-/fjj)
2022/06/14(火) 23:50:32.80ID:dnqAP5Hg0 >>718
DLLの呼び出しみたいに呼び出し先の実装をコンパイラが知らない場合
例えば引数をスタックに積む呼び出し規約だと
↓正常な動作
1)戻り先のアドレスをスタックに積む
2)引数をスタックに積む
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
これが↓異常な動作
1)戻り先のアドレスをスタックに積む
2)なんもない
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
5)わし、迷子
ってなるんちゃうん?
引数がレジスタ渡しなら、ただ変な数値受け取るだけで済むけど、今ここでの話じゃ限定してないようだし
DLLの呼び出しみたいに呼び出し先の実装をコンパイラが知らない場合
例えば引数をスタックに積む呼び出し規約だと
↓正常な動作
1)戻り先のアドレスをスタックに積む
2)引数をスタックに積む
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
これが↓異常な動作
1)戻り先のアドレスをスタックに積む
2)なんもない
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
5)わし、迷子
ってなるんちゃうん?
引数がレジスタ渡しなら、ただ変な数値受け取るだけで済むけど、今ここでの話じゃ限定してないようだし
725デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/15(水) 00:28:34.16ID:kIvvyTdz0 呼び出しって引数をスタックに積んでから、呼び出すんじゃなかったかな
726デフォルトの名無しさん (ワッチョイ ffad-/fjj)
2022/06/15(水) 00:38:49.11ID:3+VQJWvy0727デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/15(水) 00:43:20.78ID:kIvvyTdz0 引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
func関数はスタック先頭位置にあるアドレスに戻るだけではないかな
積まれている引数はその下だからズレないと思う
func関数はスタック先頭位置にあるアドレスに戻るだけではないかな
積まれている引数はその下だからズレないと思う
728デフォルトの名無しさん (ワッチョイ ffad-/fjj)
2022/06/15(水) 00:57:26.32ID:3+VQJWvy0 >>727
>引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
逆だぞ
戻りアドレスをスタックに積んでから引数をスタックに積む、その状態でfuncをコールする
そうしないと、次のpopでは戻りアドレスを受け取ることになり、引数を受け取れない
コールされたfuncはpopし引数を受け取って処理(この間にスタックへのpush/popがあったりして)、最後にpopして戻りアドレスを受け取って呼び出し元に帰る
>引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
逆だぞ
戻りアドレスをスタックに積んでから引数をスタックに積む、その状態でfuncをコールする
そうしないと、次のpopでは戻りアドレスを受け取ることになり、引数を受け取れない
コールされたfuncはpopし引数を受け取って処理(この間にスタックへのpush/popがあったりして)、最後にpopして戻りアドレスを受け取って呼び出し元に帰る
729デフォルトの名無しさん (ワッチョイ cf63-GGE9)
2022/06/15(水) 01:08:25.20ID:kIvvyTdz0 戻りアドレスをスタックに積むのは、機械語のCALL命令が行うんでしょう?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- 【🐻ゲレンデノカフェテラスデ♪】長野のスキー場にクマ 【スベルアナタニクギヅケ🐻】 [nita★]
- すまん、飲食チェーン店での一幕なんだがオマエラはこれを見て何を思うかおしえてくれ。
- 粗品「南原が3億も貰えんの?」 [279254606]
- 朝雑談
- 毎日菊花茶飲んでたら美肌になったよ
- おちんちんを露出しながら女子小学生に次々と触った無職の男(31)を逮捕「欲求やストレスを解消する為」
- 【悲報】ゆうパック配達員、配達中に人妻に抱きつき無理矢理キス「好意があると思ってた」 [566475398]
