C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!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
2022/03/19(土) 13:30:03.55ID:fvSihUDg0
返信ありがとうございます
++、--の場合は、前置、後置で
式の評価順が通常と異なると覚えました

式の評価順を理論から理解していないので
忘れてしまって失敗するかもしれませんが、
そのうち定着すると思っています
356デフォルトの名無しさん (ワッチョイ 13ad-bSSa)
垢版 |
2022/03/19(土) 15:38:29.74ID:CZI3HevE0
よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。
357デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:00:25.72ID:mw5TX/57a
b = a++;

の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは
代入されるのは aの内容でなく、アドレスを持たない値で
358デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:03:51.29ID:mw5TX/57a
a++ は右辺値で、 ++a は左辺値
2022/03/19(土) 17:12:51.80ID:X795CU5ld
どっちも右辺値としないとまずい
int main(){
int a=0;
int* p;
p=&(++a); // コンパイルエラー
p=&(a++); // こっちも
}
360デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:42:57.61ID:mw5TX/57a
そうだね、失礼しました
2022/03/19(土) 17:50:05.80ID:nPptgbtB0
: BassClass(
std::format (IdPrefix, index, numBank)),(
std::format (NamePrefix, ++index, numBank))
ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど
インクリメントしてない方までつられて増えちゃうんだよね
C++のコード片でスマソン
2022/03/19(土) 18:11:19.38ID:8Fsv/onud
d = ++a + b-- + --c + a++;
この結果は

++a;
--c;
d = a + b + c + a;
b--;
a++;
だよね
実際はこんな書き方しないほうがいいがw
2022/03/19(土) 18:25:12.86ID:d0FibUHe0
>>362
> d = ++a + b-- + --c + a++;
> この結果は
++a と a++ とが順序付けされないので未定義動作。
2022/03/19(土) 18:39:08.49ID:Uza1/JxDM
両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする
2022/03/19(土) 19:05:15.57ID:9SMEw2CG0
以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) {
int ret = *a;
*a = *a + 1;
return ret;
}
2022/03/19(土) 19:10:54.79ID:fJWxsuK3a
引数の評価順なんてCPUでも変わるだろ。
2022/03/19(土) 20:25:22.26ID:hj0ig94x0
未定義動作警察だ!

未定義動作の動作は定義されていないのでコンパイラは何をしてもいい

> d = ++a + b-- + --c + a++;
このコードの場合、
++a;--c;d=...; b--;a++;相当のコードを吐いてもいいし、
tmp=a;a=tmp+1;--c;d=...; b--;a=tmp+1; 相当のコードを吐いてもいい。
大抵は未定義動作がないことを前提に最適化をかけるが。

極端なことを言えば、d=42としてもいい。
この文の見た目の動作は定義されていないから
2022/03/20(日) 00:26:15.18ID:dAApHicf0
fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています
いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです
使っていくうちに覚えていくものでしょうか?
2022/03/20(日) 00:53:13.92ID:tmhbCmKs0
細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも
2022/03/20(日) 00:57:50.69ID:rKPZjyik0
よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか
戻り値を使っている人を見たことがないけれど
2022/03/20(日) 01:37:41.92ID:u4Grkyrm0
>>361
こういう場合については未定義ではないが未規定の動作が含まれる。
副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、
書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、
未定義の挙動にはならない。
2022/03/20(日) 08:21:37.14ID:e7HuEm7id
>>368
fgetsの戻り値は文字列へのポインタであり
いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ
2022/03/20(日) 10:46:46.29ID:+oGVYZOT0
組み込みのソフトしていると
使わない関数が多くて忘れていきます
2022/03/20(日) 11:48:15.83ID:w4XPcyomd
<stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?
2022/03/20(日) 12:55:28.41ID:DiBIkIVz0
windows.h
2022/03/20(日) 13:05:34.82ID:w4XPcyomd
使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな
2022/03/20(日) 13:25:28.64ID:y5NxTTYed
標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。
2022/03/20(日) 13:41:32.19ID:w4XPcyomd
ANSI C, C89〜C17 の規格で存在を要求されてるライブラリ

組み込みコンパイラだとそもそもC89かC99しかサポートしてないだろうし、
fileIOとかは欠けてるだろうから何なら使えるか聞きたい

組み込みの環境も多数あるだろうから >>373 みたいな人が普段どういう関数使ってるか気になった
2022/03/20(日) 13:42:12.13ID:e7HuEm7id
それぞれ組み込むシステムに付属してるだろ
一元的な名前はない
ひょっとしたらstdio.hという名前かもしれない
380デフォルトの名無しさん (ワッチョイ 13ad-bSSa)
垢版 |
2022/03/20(日) 14:14:31.30ID:4KnLtgrc0
組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。
2022/03/20(日) 14:19:28.79ID:BOo0cJz/a
string.h は普通に使えた
2022/03/20(日) 17:31:23.40ID:u4Grkyrm0
C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。
この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。
2022/03/20(日) 19:31:33.68ID:w4XPcyomd
組み込み向けの最低限の規格があるのか

#defineとtypedefしかないが
なるほどこれなら環境がどんなにショボくても用意できそう
384デフォルトの名無しさん (ワッチョイ d9da-SQ3f)
垢版 |
2022/03/20(日) 20:07:23.09ID:mxx3UMQ+0
ファイルディスクリプタを使ってEOFを知りたいんだけどどうしたらいい?

普通にreadすりゃ0になるからわかるし、そもそもファイルなら
求めたサイズより小さく読めるからわかるけど
ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい
feofとかファイルポインタだで使えんがや
2022/03/20(日) 20:57:34.02ID:cOd2oDpEM
unblocking modeでopenしたfdをreadして判定すれば
2022/03/20(日) 22:28:44.17ID:aLyHOWc60
ファイルのサイズを取得して、そこへseek するとか?

そもそも、ファイルを開いて、ファイルの終わりにseek できるかも。
元々、ファイルの追記モードもあるぐらいだから
2022/03/20(日) 22:54:16.07ID:pl7vy6aed
>ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい

そもそもreadが終端まで来たらつぎにreadしてもファイルアクセスせずに0を返すから同じだろう
2022/03/20(日) 23:19:06.05ID:dAApHicf0
>>372
よく分かりました
ありがとうございます
2022/03/21(月) 16:21:59.97ID:nqBLTVDb0
>>387
後出し情報であれやけど
readしたデータをどこかに送信、最後のデータには最後フラグを立てる
みたいなやつなので、ぴったりのときに困ってたんよ

バッファを2面用意して、すぐ送信せず常に1回貯めて送信するのが
正解なんだろうなぁ・・・ まあいいけど
390デフォルトの名無しさん (ワッチョイ 2910-tpIf)
垢版 |
2022/03/21(月) 17:02:36.51ID:geQt3ukX0
ファイルサイズと読み出し位置から残りサイズ計算するぐらいか?
2022/03/21(月) 18:07:17.68ID:bPJRBgFUM
>>389
ファイルサイズわかってるならlseek(fd, 0, SEEK_CUR) で現在位置調べりゃいいだけかと
2022/03/21(月) 21:41:26.44ID:nqBLTVDb0
一応、ファイルじゃないときのことも考慮したかった
2022/03/21(月) 22:38:50.94ID:j56ex+kVd
ファイルディスクリプタが0とか"/dev/stdin"という名前のファイルを考慮し始めたらそれはもう無理じゃ?
394デフォルトの名無しさん (ワッチョイ 5336-yL30)
垢版 |
2022/03/21(月) 23:41:34.24ID:/12E7ImH0
なんかバグやセキュリティホールの温床になりそうだな。
2022/03/21(月) 23:55:00.11ID:avj/Dp0k0
キャッシュとか、同期・非同期処理とか、ブロックされる・されないとか、
ブロックデバイス・シーケンシャルかとか、リダイレクト・パイプとか、
共有の有無とか、メモリ内共有かどうかとか、

そんな事を考えだしたら、キリがない

なんせ、Linux API の7割は、IO の説明だから、10年以上掛かる
396デフォルトの名無しさん (ワッチョイ 13ad-bSSa)
垢版 |
2022/03/22(火) 02:05:16.87ID:vyk85loe0
1バイト単位なら fdopen() しちゃって FILE * でバッファリングさせた方が楽だな。feof() も使えるし。
1バイト単位ではなく1000バイト単位とか、大きい塊でバッファリングする必要がある場合は自作して feof() みたいなチェックができるようにする。
(それでも FILE * でのバッファリングがあった方が遅いストレージにあるファイルなら読み出し効率上がると思うが)。
2022/03/24(木) 22:37:34.92ID:jD8pMP9K0
以下はライブラリバージョンが1より大きければ処理を有効する例です
#if LIBRARY_VERSION > 1

#endif

この「LIBRARY_VERSION」は何者ですか?
どこに定義されているのでしょうか?
2022/03/24(木) 23:58:11.94ID:ItLF0V9z0
>>397
少なくとも標準仕様ではどこにも定義されてないです
説明のための例では?
2022/03/24(木) 23:59:45.82ID:bdM8JANZ0
MSVC環境ならカーソル合わせてF12キー押せばいい

gccとかは知らん
2022/03/25(金) 00:14:08.19ID:sET9XTXv0
>>397
独習Cからの抜粋と予想して記載します

複数の開発環境で同じヘッダファイルを使用する際の
ライブラリバージョンの差異でエラーとなるのを防ぐための
テクニックです

各自が自分の開発環境に合わせて
#define LIBRARY_VERSION 1などと
定義する必要があります
2022/03/25(金) 06:50:38.08ID:0hAphrOld
いえ、それはそのライブラリの作者(メンテナンスしてる人)が標準ヘッダ内で定義すべき内容です
ユーザーは>>397を自分のファイル内で使用してバージョンの差異を吸収できます
402デフォルトの名無しさん (ワッチョイ 3696-VQaK)
垢版 |
2022/03/26(土) 01:22:16.42ID:EYuSPLit0
>>398,400,401
説明のための例のようですね、失礼しました
あと、この定数が未定義の場合の値は0になるのですね
そのあたりを理解していませんでした
どうもありがとうございました
2022/03/26(土) 16:05:05.08ID:EYuSPLit0
コンパイル(リンク)時に、同じプロジェクト内の別ソースの関数などを呼び出せるのはなぜ?
インクルードして教えてる訳でもないのに、もしかして全ソースを探しに行ってるんですか?
2022/03/26(土) 17:27:18.26ID:T/pJeR6z0
全ソースから探し出すのがリンク
includeとかで関数宣言だけは見えるようにする必要はあるが。

main.c
-----------
char* func(int size);
int main(){
char* p=func(16);
}
-----------

funcという名前の関数は、
前方宣言(1行目)してるのでリンク時に探しに行く。

リンク時の解決用に定義した関数(とその実装)を.objファイルに一覧としてまとめる。

リンクという作業では、.objと.libと.dllから"func"という名前の関数を探し出す。
見つからなかったり2つ以上見つかったらリンクエラーになる。

古いCだと前方宣言がなければ int func(); 決め打ちで前方宣言扱いしたりする。
2022/03/26(土) 18:26:49.41ID:kmPIEuI7d
>>403
(古典的な)Cではアセンブラソースに変換してアセンブル→リンクされるが
通常の関数名や変数名はアセンブラのグローバルシンボルに変換され
リンク時に他のアセンブラソースから参照できるようになる
一方関数内のローカル変数やstatic宣言された関数や変数はローカルシンボルとして扱われ他のアセンブラソースからは参照できなくなる
2022/03/26(土) 23:45:36.64ID:EYuSPLit0
よく分かりました、ありがとうございました
2022/03/27(日) 21:02:14.58ID:angONFKk0
グローバル変数の修飾子の意味は次の意味で合っているでしょうか?

修飾子なし:変数の実体を定義
extern修飾子:定義済みの変数を参照する
static修飾子:変数の実体を定義して、その変数を他のファイルからexternさせない
2022/03/28(月) 11:08:20.21ID:c4HYTfCO0
適当にググって見つかったexternとstaticの解説

ttps://daeudaeu.com/extern/
ttps://daeudaeu.com/static/
2022/03/29(火) 00:24:04.59ID:c+1KPnOj0
>>408
そのサイト含めいろいろ見て、それをまとめたのが>>407です
念のためどなたかに確認していただこうかと思って書き込みました
2022/03/29(火) 06:11:36.84ID:7UUvIzLId
そんなに信用されてもw
411デフォルトの名無しさん (ワッチョイ b110-UE6D)
垢版 |
2022/03/29(火) 08:18:01.14ID:C0VnxRTv0
自分で色々なパターンでコンパイルして確認しないのかな?って思う。
2022/03/29(火) 08:55:46.71ID:tKmNrPY6d
正確な意味を知るには解説サイト見て回るより規格書見るほうがいい

http://real-c.info/indexDesc.html
2022/03/29(火) 13:03:41.11ID:M0Gs9C4cM
llvm-14 の、ソースツリーの外にcmake ディレクトリができる下品な感じ、なんとかならないの?
2022/03/29(火) 15:17:04.78ID:X58TTE+20
>>413
cloneしたディレクトリの直下にbuildディレクトリ作ってそこでcmake 〜 ../llvmじゃいかんの?
今どきソースのディレクトリで直接ビルドしないのは下品というより上品ではないですか
2022/03/29(火) 18:15:06.70ID:U1DxU1KgM
>>414
>ソースツリーの外に

下品
2022/03/29(火) 18:20:46.45ID:1zZAboUWM
ソースツリーの中にbuildフォルダ作るのは上品なん?
2022/03/29(火) 18:47:55.98ID:4oPH291+0
autotools でも out-of-tree build は出来るようにするのが一般的な作法。
あらゆるプロジェクトでそうしているというほどではないと思うけど、ごく普通にある。
2022/03/29(火) 22:23:02.11ID:X58TTE+20
https://llvm.org/docs/CMake.html を見るとソースフォルダの外でビルドしなきゃいけないような感じに書いてあるけど、
https://clang.llvm.org/get_started.html を見るとリポジトリ直下にbuild作ってそこでビルドすればいいように書いてあるから、llvmはお上品にビルドできるのですわ
2022/04/01(金) 12:18:00.47ID:BXJ/mUbsM
llvm-14
まだゴミw
色んなものがダメになるw
2022/04/12(火) 19:31:59.59ID:B1tFLWvv0
char buf[256];
memset(buf, NULL, sizeof(buf));・・・(1)
memset(buf, 0, sizeof(buf));・・・(2)

(1)と(2)同じ事をしていると思うのですが、どっちで記述するのがメジャーですか?
2022/04/12(火) 19:35:46.65ID:Dt0TGPDOd
NULLはポインタだから(2)が正しいよ。
2022/04/12(火) 20:06:33.56ID:5njWaFr40
>>420
言語仕様に厳密にいうと前者で初期化しようとした場合に buf が 0 で初期化されることは保証されないし、
コンパイルエラーになることもありうる。

整数定数式の 0 がポインタに変換したときに空ポインタになることは保証されるので
NULL が単に #define NULL 0 として定義している環境もよくあるんだが、
仕様上の NULL は「処理系定義の空ポインタ定数に展開する」ということになっていて
整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。

そんで「整数定数式の 0」がポインタに変換されたときに空ポインタになることは保証されるが、
定数式ではない文脈での整数の 0 は空ポインタになることは保証されていないし、
逆に空ポインタを整数に変換したときに 0 であるとも限らない。
if 文などの制御式としてポインタを置いても問題ないのは C の制御式は !=0 が補われたかのように動作するというルールのおかげ。
2022/04/12(火) 20:07:57.92ID:B1tFLWvv0
>>421-422
お早いレスサンクス
わかりました
2022/04/20(水) 22:16:48.28ID:vxzn/db60
>>422
>整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。
可変長引数にあるあるの最後に (char *)0 (なんで char * なんだ?)なんかがいい例ですね
2022/04/22(金) 15:01:50.27ID:YxI2bgUE0
(ソースtt.c)
#include <stdio.h>
#include <math.h>

void main()
{
double d;
int a;

d = 1.234;
a = round(d);
printf("%d\n", a);
}

$gcc tt.c
/tmp/cc0NPwg6.o: 関数 `main' 内:
tt.c:(.text+0x23): `round' に対する定義されていない参照です
collect2: error: ld returned 1 exit status

こんな短いソースなのに解決できない。助けてー(´・ω・`)
OSはLinuxです
2022/04/22(金) 15:04:48.71ID:SxzvmxoM0
どうせリンクしてないとかそんなんだろ
2022/04/22(金) 15:05:51.08ID:BJPJNuGwd
>>425
古いコンパイラにはroundがないかもしれない。
2022/04/22(金) 15:06:16.30ID:BJPJNuGwd
-lm
2022/04/22(金) 15:12:16.74ID:SxzvmxoM0
gccなら -lmで動的リンクする簡易オプションがある、プログラム内だけで完結したいならコンパイラ付属のmathライブラリのソースも含めてコンパイル
2022/04/22(金) 15:14:29.72ID:SxzvmxoM0
動的リンクだとmathは浮動小数点の扱いが実行環境に依存するので静的リンク推奨
2022/04/22(金) 15:26:22.00ID:YxI2bgUE0
ありがとう
gcc tt.c -lm
でコンパイル通りました。
2022/04/22(金) 15:44:53.29ID:I04xh82td
割とよく使う標準ライブラリなのに一々リンク方法をユーザーに選択させるという事の意義を考えるように、おまじないじゃないぞ
2022/04/22(金) 17:13:59.15ID:RFW8R+x+d
roundかtruncかfloorかはたまたceilかもしれないrintとその一味のヤバいやつら
こんなもんさっさと追放しろよ
2022/04/22(金) 17:31:11.41ID:SxzvmxoM0
整数型で表せない整数をdoubleで表したい時も稀にある
どうせ前後の整数(±1)は表せない不連続すきっ歯領域だし、どう丸まろうが影響無い部分だよ、って意図の明示に
2022/04/22(金) 17:49:02.83ID:SxzvmxoM0
用途は思い浮かばないでもないが、適切に使われてないケースが多分99%
2022/04/23(土) 13:45:19.22ID:+Gd9xYyP0
表せないときは整数型多倍長処理作る
437デフォルトの名無しさん (ワッチョイ 2cae-E6ke)
垢版 |
2022/04/24(日) 11:54:23.21ID:S9c+iUdl0
GMPでそ
C++じゃないとちょっと使いにくいけど
2022/04/24(日) 15:18:10.66ID:Qwrn6LYl0
>>437
激しく同意
https://mevius.5ch.net/test/read.cgi/tech/1434079972/84
2022/04/25(月) 03:24:41.99ID:LAuA6+3Dd
多倍長整数とか言ってる人は意図汲めてなくね?

正確性も表現力も不要だけど、それでも整数に相当する巨大数が要るのは極を利用した求根アルゴリズム(方程式解法)とかでしょうよ

たとえば、求めたい関数fの根がその逆数関数1/fの極と等しい事を利用するとか

もしdoubleの範囲を多倍長整数/任意桁数演算で308桁を陽に扱必要があるけど、そもそも極判定は指数部のみで行えるわけで、各桁の数字を陽に保持する意味が無い


一方で指数が巨大なdoubleを生で足すのは悪手
丸めれば各々の積分経路での評価値は真値から一旦遠ざかるけど、一貫した丸めを行う限りは10000万回も足せば互いに相殺されて均される
2022/04/25(月) 03:38:21.89ID:LAuA6+3Dd
ちょっと拵えすぎたような設定だったかもしれないけど、300桁を陽に保持して、ハードウェアの恩恵も無しに一万回加算とか、向かないどころかあまりにも非現実的過ぎる例もある
という例程度に

あとdouble使ってればinfが返ってくる可能性があるのが最大の利点
もしinfを引き当てられれば、それを与正入力がその浮動小数点実装における最高精度の解だと理論的に保証される
2022/04/25(月) 03:44:18.07ID:LAuA6+3Dd
訂正と補足
それを与正→与えた入力

(1/f)(x)→inf

f(x) → 0

fの根はそのx
は論理的に同値
2022/04/25(月) 05:05:51.34ID:ueJIdSJ50
INF見付かれば恣意的に収束/発散閾値を調整しなくてエレガントだよな

俺は素性の事前に分かってて留数定理使えるような関数くらいしか扱わないから、気にせずそのまま足しちゃうわ

積分経路は(楽だから)正方形に取り、均等に4分割して極のある範囲を再帰的に絞り込んでる、下手にニアミスしたりするとかえって桁落ちしたりして整数倍からズレる
±0.1くらいなら、きっと極を囲めてるものと想定

Cで数値計算入門みたいな本で勉強してるけど、浮動小数点の特殊値とかエラーの扱いとかの記述が一切抜け落ちてて困る
2022/04/25(月) 19:15:48.77ID:o7ajKrF0d
実質ハードの実装に収束(発散)判定任せて綺麗に見えてるだけだがな
しかし比較無しに符号、複素数なら東西南北まで得られるのは便利
2022/05/09(月) 06:57:39.16ID:Egg1/KgR0
20年くらい前、Windows98が使われてた頃なんですが
char s = ''; // ←シングルクォーテーション2個
っという書き方が許されてた記憶があるんですが、記憶違いかな?
今Linux上のgccでコレをコンパイルすると「error: empty character constant」になる
2022/05/09(月) 07:35:16.71ID:QnLN+NJ0a
あえてなのかバグなのかは知らんけど20年前のコンパイラがそういう記法を通してたってだけだろ
2022/05/09(月) 08:27:27.53ID:Egg1/KgR0
>>445
冷静に考えてみたらコンパイラもOSも違うからそういうことだな
2022/05/09(月) 10:42:17.80ID:qGH53jdv0
''で何が代入されるの?
2022/05/09(月) 11:12:38.36ID:DLFHVgdp0
'\0' や 0 と同等の動作なんかねぇ
2022/05/09(月) 11:15:27.95ID:DuxsXAR8M
普通に考えれば空文字だと思う
2022/05/09(月) 11:35:54.50ID:lTlzTKNA0
NULL 「何もないよー」な意味をあらわす単語
空文字 長さ0文字の文字列のこと

この解釈でOK?
2022/05/09(月) 11:37:44.15ID:DLFHVgdp0
文字と文字列は違う 今話題に上がってるのは文字のほう
2022/05/09(月) 12:02:23.30ID:ItS/vT2KM
長さ0文字の文字列なら""(ダブルコーテーション)では?
2022/05/09(月) 14:03:39.88ID:KBCMvYUWa
>>448
まあそれが一番ありがちかと
2022/05/09(月) 17:13:19.74ID:9vSL2/iz0
>>444
言語仕様にはそれを通す規定は見つからないな。
少なくとも一文字は必要であることになってる。
C89 ではすでにそうなってるし、後の仕様でも変更はない。
出来る処理系があったのだとしたらあくまで処理系の拡張。

「たとえば 'ab' などのように二文字以上を含む場合は処理系定義」という意味の規定はあるので
雑に任意個の文字を受け付けるようにしたらうっかり 0 個も通してしまったとか、
意図的ではない挙動 (コンパイラのバグ) だった可能性もあるし。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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