C言語で10進数の0
なるほど、C標準では0は8進法だと明確に定義されてるので10進法で0を書く方法がないw
https://gyazo.com/3eddd2da2ac2e8a7280835dd5fad3cdd
「C言語で」とは言われたがいつのC言語とは言われてないので「0が8進と定義される前のCコンパイラ」をどこかから見つけてきて0って書くとかかな…
---
Pythonだと 0 が10進法リテラルであるのみならず 0_0 も 0_0_0 もだったw doc https://gyazo.com/c83b125447526f4d9f9b3c157961167b
---
bday1u2t:
リテラル「0」の0はあくまでもprefixとして定義されていて、Semanticsにはこのリテラルをどのような数として解釈すべきか記述されていない(数として解釈すべき本体が存在しない)ように読み取れます。
つまり「C言語ではリテラル"0"の意味は未定義」となるのでは?
https://gyazo.com/af6d32db38dbfd42c1431e0aee9d6510
uchan_nos:
ちょうどその画像のSemanticsのところに、8進定数の値は8を基数として計算される、と書いてありますよ。0は8進数として解釈されて、値0となります。(0の値がもし未定義だったら世のほぼすべてのプログラムは未定義の動作に依存してしまいます)
bday1u2t:
いや、Descriptionに8進リテラル先頭の0はprefixである、と書かれています。
16進の0xは数の一部として解釈されないように、8進の0も数の一部として解釈されるものではないと読み取るべきではないでしょうか。
(もちろんどんな実装もリテラル「0」を0と解釈すべきというところに異論はありません)
nishio:
面白い指摘。確かに同様にprefixと呼ばれてる16進法リテラルの0xは取り除いた残りを16進法として解釈するわけなので、8進法リテラルも同様に取り除いてから解釈すべきで、そうなると「空文字列を8進法表記として解釈した場合、0とする」という振る舞いが明確に定義されてないですね
kaityo256:
横からすみません。descriptionには「8進数は0スタートで、optionally followed by 0-7」と書いてあるので、単独の「0」は8進数であると定義されているように読めます。
nishio:
単独の「0」が8進法リテラルであることに異論はないですが、それが整数の0に対応することが明文化されていないと思います。なぜなら、その、最初の「0」をprefixと呼んでおり、16進リテラルの場合はprefixを取り除いた部分が16進表記の整数で、8進法の時に取り除かないとは書いていないから。
kaityo256:
うーん、Syntaxには単独の「0」は「octal-constant」であることが定義されており、Descriptionの「optionally」を文字通り解釈すると単独の「0」はハイフン無しの「octal constant」と解釈され、その後のsemanticsにより「8進数の0」と解釈されるように僕には読めますね……
nishio:
optionallyは文法上followedにかかるので、1文字の「0」はprefixの0だけが存在し、optionalである「prefix以外の部分」が空文字列になる、と解釈されるように思います。
kaityo256:
単独の「0」が「prefix 0」のみの「octal constant」と解釈されるのは間違いないですが、そういう意味では、そもそも「(16進の時も)prefixは取り除いて残りを解釈せよ」という定義が見当たらない気がしてきました。「prefixとは何か」について厳密な定義はされているのかしら?
nishio:
とこんな英文解釈の話をしててもっと新しい標準で英文が変わってたらなんだなーと思ってもっと新しいやつを出してきたら0が議論の余地なく0になる定義に変わってる感
(追記: ここで出してきているのはC言語のではなくC++のもの)
https://gyazo.com/254b1e2d2c2c12be496aa3414dc3a90e
これだと「prefixは取り除け」と明記してあって、prefixという言葉は構文の定義にしか出てこない(ので8進リテラルの0はprefixではない)ということで、すっきり解決したっぽい
https://gyazo.com/994e1681a2f0fee34a0e830a94023d26
kaityo256:
おお、prefixについてもちゃんと(Noteだけど)定義されていますね。誰かが文句言ったのかな。
逆に、このようにアップデートされた、ということは、以前の仕様の記述には問題があった、ということなんでしょうね。