ページ 11

整数リテラル0が8進リテラルであることの説明

Posted: 2016年8月31日(水) 01:48
by peyoun9
いつもお世話になっております。
今、読んでいる本に次のような問題があるのですが、理解度が不十分なせいか答えられません。
皆様ならどう解答されますか。
 演習4_3
整数リテラル0が8進リテラルであることを論理的に説明せよ。

演習問題なのでコードを書くのでしょうが、0が先頭文字になるのは8進リテラルだということをコンパイルして証明すれば良いということでしょうか。

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年8月31日(水) 02:20
by かずま
peyoun9 さんが書きました:いつもお世話になっております。
今、読んでいる本に次のような問題があるのですが、理解度が不十分なせいか答えられません。
皆様ならどう解答されますか。
 演習4_3
整数リテラル0が8進リテラルであることを論理的に説明せよ。
C の規格書 JIS X3010:2003(ISO/IEC 9899:1999) に書いてあるから。

コード:

6.4.4.1 整数定数
構文規則
    整数定数:
        10進定数  整数接尾語opt
        8進定数  整数接尾語opt
        16進定数  整数接尾語opt
    10進定数:
        非0数字
        10進定数  数字
    8進定数:
        0
        8進定数  8進数字
    16進定数:
        16進接頭語 16進数字
        16進定数 16進数字
    16進接頭語: 次のいずれか
        0x  0X
    非0数字:  次のいずれか
        1  2  3  4  5  6  7  8  9
    8進数字:  次のいずれか
        0  1  2  3  4  5  6  7
    16進数字:  次のいずれか
        0  1  2  3  4  5  6  7  8  9
        a  b  c  d  e  f
        A  B  C  D  E  F
    整数接尾語:
        U接尾語  L接尾語opt
        U接尾語 LL接尾語
        L接尾語  U接尾語opt
        LL接尾語  U接尾語opt
    U接尾語:  次のいずれか
        u  U
    L接尾語:  次のいずれか
        l  L
    LL接尾語:  次のいずれか
        ll  LL

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年8月31日(水) 02:31
by かずま
peyoun9 さんが書きました:演習問題なのでコードを書くのでしょうが、0が先頭文字になるのは8進リテラルだということをコンパイルして証明すれば良いということでしょうか。
コードを書く必要はないと思います。
規格書を引用できないなら、次のように書くぐらいでよいのでは?

コード:

10進定数は 0以外の数字で始まるから、0は 10進定数ではない。
16進定数は 0x または 0X で始まるから、0は 16進定数ではない。
8進定数は 0で始まるから、0は 8進定数である。

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年8月31日(水) 08:59
by peyoun9
かずまさん、返信頂きありがとうございます。

8進リテラルが0~7で始まること10進は0で始まらないこと、16進は0xで始まることは私も学習致しました。

今まで取り組んできた演習問題に文章で解答するパターンがなかったので、なんとなくコードをかくのかなと思ったのですが、コードで説明するというのは可能なのでしょうか?

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年8月31日(水) 23:23
by box
peyoun9 さんが書きました:8進リテラルが0~7で始まる
0で始まることはわかりますが、1~7で始まるというのはよくわかりません。
0で始まって0~7「を使う」ならば、何とかわかります。

まあ、それはさておき、こんなコードを書いてみてコンパイルエラーになることで説明が付きませんか?

コード:

#include <stdio.h>

int main(void)
{
    int n = 08;
    
    return 0;
}
こちらの環境(gcc4.9.3)では、こんなエラーが出ました。
C-Application3.c:5:13: error: invalid digit "8" in octal constant

8進数の数値には8は使えねーぞってことで。

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年9月02日(金) 00:35
by peyoun9
boxさんありがとうございます。
0で始まることはわかりますが、1~7で始まるというのはよくわかりません。
0で始まって0~7「を使う」ならば、何とかわかります。
仰るとおり、0~7「を使う」の誤りでした。8進数と8進リテラルとを混同しておりました。

さて、整数リテラル0が8進リテラルであることの説明という問いに対する答えは、やはりかずまさんの
かずま さんが書きました:10進定数は 0以外の数字で始まるから、0は 10進定数ではない。
16進定数は 0x または 0X で始まるから、0は 16進定数ではない。
8進定数は 0で始まるから、0は 8進定数である。
に尽きるということでしょうか。

Re: 整数リテラル0が8進リテラルであることの説明

Posted: 2016年9月22日(木) 22:02
by peyoun9
返信遅れましたが、皆さま、ご閲覧・ご回答ありがとうございました。

boxさんの書いてくださったコードも参考になりました。

自分の環境でも試して同様のエラーを確認できました。

ありがとうございました。