見出し画像

JISX3010を読む 日本語がムズイんですけど

わりとシツコイ質です。
JISX3010の記述も気になってくるわけで。

国際標準化機構(ISO)の日本語版がJISなのだそうだ。最近はC言語を書いていてもほとんど同じパターンの書き方しかしないので、わざわざ規約を紐解くこともない。久しぶりに読んでみたら面白いやら唸るやら首を傾げるやらという有り様である。

とにかく。

日本語がよくわからへんねん…


JISXには次のような記載がある

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

JISX3010 6.5 式

よくわからない文章だ。
一応次のようなサンプルコードが付与されている。

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

JISX3010 6.5 式

そもそも最初の

直前の副作用完了点から次の副作用完了点までの間に

JISX3010 6.5 式

がイマイチわからない。なんとなくはわかるんだが。
続く文章が次のようになっている。

式の評価によって一つのオブジェクトに格納された値を変更する回数は,高々1回でなければならない

JISX3010 6.5 式

これは次のサンプルコードと付き合わせると、だいたいはわかる。

i = ++i + 1;

JISX3010 6.5 式

この図の赤い部分と青い部分の2回で「i」が変更されているからだ。

1つのオブジェクトが2回変更される式

式の評価によって一つのオブジェクトに格納された値を変更する回数は,高々1回でなければならない

とは

1つの式で同じオブジェクトを2回以上変更するな

ということだ。
この文章だけで完結して表現できているように思う。
じゃあ、その前に言及されている

直前の副作用完了点から次の副作用完了点までの間に

って、何なんだ。
わざわざ付け足さなければならない意味があるのかと考えを巡らせるのだが、さっぱり思い当たらない。

そしてもう1つの文章。

さらに,変更前の値の読取りは,格納される値を決定するためだけに行われなければならない。

JISX3010 6.5 式

???
文章だけではわからない。
サンプルコードは次のようになっている。

a[i++] = i;

JISX3010 6.5 式

今度は2回変更されるオブジェクトはない。
だから、先程の問題とは違う。
アヤシイのは「i」だ。

変更前の値の読取りは,格納される値を決定するため

というのは次の図の青い部分。

だから赤い部分の「i++」がダメなんだろう。
だったら、次の方がわかりやすくないか?

格納するために読み取った値は同じ式で変更してはならない

格納される値を決定するためだけ」というのがどうにもまどろっこしくて「~だけはいい」という表現よりも「~はしてはならない」と、ダメなことを明確に表現する方がわかりやすいように思うんだが。ISO の原文がそういう表現なのか、翻訳に問題があるのか、はたまたこの表現に重要な意味があるのか。


ついでに clang にお伺いを立ててみた

さきのサンプルコードについて clang にお伺いを立ててみた。最近は clang 様様である。

i = ++i + 1;

cc -g -gdbx jis_6.5_70-1.c -o /data/data/com.termux/files/usr/bin/_local/jis_6.5_70-1
jis_6.5_70-1.c:4:6: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
        i = ++i + 1;
          ~ ^
1 warning generated.
~/c/krc $

「unsequenced modifications」というのは前回の次のコードでも警告された。

a[i] = i++;

こんどは「multiple」が付いている。
しかも「~」と「^」の位置も的確。
あんたはエライ!

a[i++] = i;

cc -g -gdbx jis_6.5_70-2.c -o /data/data/com.termux/files/usr/bin/_local/jis_6.5_70-2
jis_6.5_70-2.c:5:5: warning: unsequenced modification and access to 'i' [-Wunsequenced]
        a[i++] = i;
           ^     ~
1 warning generated.
~/c/krc $

こちらは前回の「a[i] = i++;」と同じ警告だねぇ。


この記事が気に入ったらサポートをしてみませんか?