ここから本文です

C言語に関する質問です。

長里予 広禾念さん

2019/9/1200:09:54

C言語に関する質問です。

//例1
#include <stdio.h>

int main(void){
␣int c=0;

␣c=c--+--c; //←注目

␣printf("%d",c);

␣return 0;
}



//例2
#include <stdio.h>

int main(void){
␣int c=0;

␣c=c++-++c; //←注目

␣printf("%d",c);

␣return 0;
}

はコンパイルが通るのに,

//例3
#include <stdio.h>

int main(void){
␣int c=0;

␣c=c-----c; //←注目

␣printf("%d",c);

␣return 0;
}



//例4
#include <stdio.h>

int main(void){
␣int c=0;

␣c=c+++++c; //←注目

␣printf("%d",c);

␣return 0;
}

がコンパイルエラーになるのは何故でしょうか?

実は,例3や例4でもコンパイルが通るコンパイラが存在すると言っている人もいますが,私はそんなコンパイラを見たことが有りません。

また,例3や例4はC言語の文法的に,何か問題があるのでしょうか?

補足※敢えて補足する必要は無いのかもしれませんが,TABやSPACEが削除されてしまう為,代替の視認性を上げるための字下げ用文字として「␣」を使用しております。

粗探しされて不毛な流れになったら嫌なので,念のため補足しておきます。

閲覧数:
31
回答数:
1

違反報告

ベストアンサーに選ばれた回答

mok********さん

2019/9/1200:59:59

c+++++c

を手元でコンパイルしてみたところ、++が変数でないものにかかっている的なエラーがでました。

おそらく
c ++ ++ + c
と分解されているんだと思います。

最長一致原則に従って字句解析したと考えればこれは自然な結果です。


構文解析の段階でエラーとなるわけですが、字句解析の候補が複数ある場合に構文エラーが起きないものを選ぶといったことは行われないということでしょうね(やろうとしたら処理も増えてかなり大変だと思います)。


c++-++c

は最長一致でも

c ++ - ++ c

としか分解されようがないので、問題なくコンパイルされるのだと思います。

質問した人からのコメント

2019/9/12 01:12:41

確かに,状況証拠と致しまして,
・c=c++---c;
・c=c--+++c;
は,コンパイルエラーになりましたし,

・c=c+++--c;
・c=c---++c;
は,コンパイルが通りました。

故に,そういう事だと考える事に致します。

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

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる