C言語なら俺に聞け 163 (975レス)
1-

1
(4): デフォルトの名無しさん (ワッチョイ 7bba-Lem2) [] 2024/07/16(火) 22:43:54.18 ID:ZrsCjURC0(1) AAS
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
外部リンク:paiza.io
外部リンク:ideone.com
外部リンク:codepad.org

C17
外部リンク[pdf]:www.open-std.org

C11
外部リンク[pdf]:www.open-std.org

C23 最新ドラフト
外部リンク[pdf]:www.open-std.org

C99
外部リンク[pdf]:www.open-std.org
外部リンク[html]:kikakurui.com

C FAQ 日本語訳
外部リンク:www.kouno.jp

JPCERT C コーディングスタンダード
外部リンク:www.jpcert.or.jp

※前スレ
C言語なら俺に聞け 162
2chスレ:tech VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
951: デフォルトの名無しさん (ワッチョイ df79-rWPO) [sage] 2025/07/23(水) 13:52:34.35 ID:tnCWMZQY0(1) AAS
そんなことより次スレ立てろ
952: デフォルトの名無しさん (ワッチョイ df20-IWxR) [] 2025/07/23(水) 15:03:57.88 ID:P5w72ZiU0(1) AAS
今ならAI会話機能で普通に掲示板に参加できちゃうからなぁ
このスレ読んで適当に参加しといて、って済む
953
(3): デフォルトの名無しさん (ワッチョイ 6776-7F+n) [sage] 2025/07/23(水) 19:09:07.95 ID:trP3on0s0(2/2) AAS
老人がGPTと会話して寂しさを紛らわせてるという話をラジオで聞いて愕然としたわ
会話に女性言葉を使うように教育してるらしいw
954: デフォルトの名無しさん (ワッチョイ 7f2a-FKn4) [sage] 2025/07/23(水) 19:46:57.29 ID:GgPu1M5y0(1) AAS
愕然としたのは、どちらに対してなのか。
(1)老人がGPTと会話して寂しさを紛らわせてる
(2)会話に女性言葉を使うように教育してる

どちらもそう驚くような事ではないような気がする。
955: デフォルトの名無しさん (ワッチョイ 275f-Bd2j) [sage] 2025/07/23(水) 19:48:56.05 ID:GY0NWQeb0(1) AAS
>>953
もう終わりだ猫の国・・・
956: デフォルトの名無しさん (ワッチョイ bfc6-Wb7d) [sage] 2025/07/23(水) 20:14:36.18 ID:1KYXdV2G0(1) AAS
>>953
気付いてないかもだけど
今のおまえがその状態だぜ?
ねらーとして教育された俺らAIと会話してるだろ
957
(1): デフォルトの名無しさん (ワッチョイ ff44-k2hJ) [] 2025/07/23(水) 20:30:44.96 ID:+gAzCYHm0(1/2) AAS
すごい久しぶりにプログラム書いててわからないことがあるので教えてください。
OSはwindows11、WSLのdebianを利用していてgccのバージョンは12.2.0です。

int i = 0;
char str1[] ="abcd";
char str2[] = "12,";
while((str1[i] = str2[i++]) != ','){}
printf("%s\n",str1);

上記を実行すると「a12,」となります。
whileの条件式内で、str2[0]がstr1[1]に代入、str2[1]がstr[2]に代入...という感じだと思うのですが
whileの行をwhile((str1[i++] = str2[i]) != ','){}に置き換えると結果が「2,cd」になるのがわかりません。
自分的には、str2[0]がstr1[0]に代入、str2[1]がstr1[1]に代入...となり「12,d」になると思ったのですが…
958: デフォルトの名無しさん (ワントンキン MMbf-2Ztb) [sage] 2025/07/23(水) 20:50:21.05 ID:2qHIY8UIM(1) AAS
>>953
AIキャバクラ流行りそう
959
(1): デフォルトの名無しさん (ワッチョイ bf5f-cpV+) [] 2025/07/23(水) 20:55:02.21 ID:e3NYz5GR0(1) AAS
#include <stdio.h>
int main(void){
int i = 0;
char str1[] ="abcd";
char str2[] = "12,";
//while((str1[i] = str2[i++]) != ','){}
while((str1[i] = str2[i]) != ','){i++;}
printf("%s¥n",str1);
}
普通こう書くだろ.clangだと
1.c:6:24: warning: unsequenced modification and access to 'i' [-Wunsequenced]
6 | while((str1[i] = str2[i++]) != ','){}
| ~ ^
1 warning generated.
と怒られるわ.
960: デフォルトの名無しさん (ワッチョイ ff44-k2hJ) [] 2025/07/23(水) 21:22:42.87 ID:+gAzCYHm0(2/2) AAS
>>959
ありがとうございます。
書き込み後、演算子の優先順位について調べたところむしろ後者の方が正しいっぽいことがわかりました。
またコンパイラ時に-Wallオプションをつけると前者ではwarning: operation on 'i' may be undefined [-Wsequence-point]という警告が出ました。
色々調べた結果面倒くさいので言われた通りwhileの条件式内で安易に++と使わないという結論に至りました。
皆様ありがとうございました!
961: デフォルトの名無しさん (ワッチョイ df56-Og3R) [sage] 2025/07/24(木) 01:19:31.21 ID:UloxWUsk0(1) AAS
>>957
ループとは関係無く str1[i] = str2[i++] だけで未定義動作となる。warning はこのことを言っている。C言語 FAQ 3.1, 3.8 辺り。
962: デフォルトの名無しさん (ワッチョイ bf2d-wD34) [sage] 2025/07/24(木) 01:37:43.61 ID:TlZSn1hO0(1) AAS
最近は多少冗長に見えても優先度とか考えなくてもすらっと読めるコード書くわ
ループの条件に副作用入れない
963: デフォルトの名無しさん (ワッチョイ 875f-Amq+) [sage] 2025/07/24(木) 08:41:37.63 ID:oNGIO7CX0(1) AAS
オートインクリメント、オートデクリメントの副作用の話か
同一ステートメントに書くと見た目の順番と違う結果になるって奴な
んなもん江戸時代から言われてんだろ
964: デフォルトの名無しさん (ワッチョイ dff2-IWxR) [] 2025/07/24(木) 10:45:19.14 ID:wqvn4Vxa0(1) AAS
普通に小学生でも読める算術式で書けよ
何のためにコンパイラが頑張ってると思ってんだよ
アセンブラ使いじゃああるまいし
965: デフォルトの名無しさん (ワッチョイ 272a-FKn4) [sage] 2025/07/24(木) 11:03:54.12 ID:jHINgk3r0(1) AAS
いっそ for 文に... いえ何でもないです...
//while((str1[i] = str2[i++]) != ','){}
//while((str1[i] = str2[i]) != ','){i++;}
for (; (str1[i] = str2[i]) != ','; i++) {}
966: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0732-geQ+) [sage] 2025/07/24(木) 12:40:38.15 ID:QLFMUI9/0(1/2) AAS
C99 だと 6.5 に書いてある制約だ。 (以下は JIS からの抜粋)

> 直前の副作用完了点から次の副作用完了点までの間に,
> 式の評価によって一つのオブジェクトに格納された値を変更する回数は,
> 高々1回でなければならない。
> さらに,変更前の値の読取りは,格納される値を決定するためだけに行われなければならない。

この後段の部分が分かり難いんだが脚注に例がある。

> この段落の規定によると,
>  i = i + 1;
>  a[i] = i;
> は許されるが,
>  i = ++i + 1;
>  a[i++] = i;
> は,未定義の式文である。

ちなみに C では「〜しなければならない」という表現はそれを守っていないプログラムの挙動は未定義という意味。
967: デフォルトの名無しさん (ワッチョイ df0a-WCdg) [] 2025/07/24(木) 18:51:03.75 ID:bvlLnJ990(1) AAS
そんな可読性の低いコードを書くのはかなりの変人だしな
968: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0732-wrhS) [sage] 2025/07/24(木) 21:58:08.95 ID:QLFMUI9/0(2/2) AAS
ひとつの単純な背景として昔は画面が狭かったということがある。
無理に詰め込んででもひとつの画面内で多くを見れるほうが可読性が高かった。
C が最初に登場した頃ならまだテレタイプ端末もそれなりに使われていたかな。
今ではあえて詰め込む必要はもう無いし、結局は時流に合わせるしか仕方がないのだが……何十年も前のコードを読む機会もあるのが C という言語なので普段は使わなくても知識として持っておくに越したことはないよ。
969: デフォルトの名無しさん (ワッチョイ 5f65-BzSr) [sage] 2025/07/25(金) 08:36:22.41 ID:D7FikuaG0(1/2) AAS
Cは未定義や不定を50年も放置している不完全言語ですからね
970: デフォルトの名無しさん (ワッチョイ 0788-HXVF) [sage] 2025/07/25(金) 13:32:45.43 ID:BONr3CXd0(1) AAS
未定義や不定を避けて書けるようになるまで、cを使ってはならない
971
(2): デフォルトの名無しさん (ワッチョイ 7f98-7F+n) [sage] 2025/07/25(金) 14:46:16.09 ID:fOKAZPz70(1) AAS
CなんかAIに聞きながらやったらなんだってパーフェクトな解答示してくれるよ
972: デフォルトの名無しさん (アウアウウー Sa2b-HBOg) [] 2025/07/25(金) 15:56:16.47 ID:ragLZ8kba(1) AAS
条件式の[]の中で[i++]みたいなことはまずしないつもりでも
*q++=*p++;
なことはやるんだよな

while(*q++=*p++){}
行き着く
973: デフォルトの名無しさん (ワッチョイ 875f-Amq+) [sage] 2025/07/25(金) 16:29:44.74 ID:4H/J6x/d0(1) AAS
単一ステートメント内で同じ変数を複数箇所で参照しての++の使い方が問題なだけだぞ
974: デフォルトの名無しさん (ワッチョイ bf7e-wD34) [sage] 2025/07/25(金) 16:42:06.69 ID:EN2Q4Hd70(1) AAS
>>971
例えばロックフリーの実装させてみ?
でそれ正しいものか判定してみ?
975: デフォルトの名無しさん (ワッチョイ 5fc7-BzSr) [sage] 2025/07/25(金) 20:39:28.29 ID:D7FikuaG0(2/2) AAS
>>971
あいつらいつもいつもcloseとかfree忘れるで
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.026s