変数名内にコメントを書くことはできますか?


144

上記のコードがあり、トークンをカウントしたい場合、14トークンまたは13トークンになりますか?

変数名の中にコメントを書くことは有効ですか?あなたは、と仮定することができint iint aint iaグローバルに定義されています。


13
少なくともGNUcpp -traditionalによって実装されているように、ANSI以前の「従来の」Cでは、に拡張されia = 10;ます。
ネイトエルドレッジ

37
なんて面白い質問でしょう-なぜそれが以前に私に起こらなかったのですか?
StephenBoesch

178
@javadba:賢明な人々はそのようなことをすることを考えないので?
jamesqf

5
本当にそれをしたいのなら、Fortranに移行することができます。文字列の外側の空白は、最初の解析段階で削除されます。
mpez0

3
タイトルを「....変数名...」に編集しようとしていましたが、実際には「間」を意味している可能性があることに気付きました。(元のタイトルの答えが「なぜ、明らかに!」であるため、編集したかったのです。重要な部分は「空白なし」です。)タイトル「コメント(空白を囲まない)はCのトークンを区切りますか?」あなたの実際の質問を表現しますか?
ピーター-モニカを復活させる

回答:


198

コメントは、プログラム変換1のフェーズ3で削除されます。各コメントは1つのスペース文字に置き換えられます。したがって、コメント/*nt*/は間違いなくトークンではありません。

なしの場合はintmainiaまたはreturnプログラムを解析する生産、マクロを前処理として定義されている14個のトークン(いない13)。

int main ( ) { i a = 10 ; return 0 ; }

ステートメントi付きの型として定義されていない限り、C文法の規則と一致しないためtypedef、構文エラーが発生しますi a

したがって、変数名内にコメント書き込むことはできません。コメントは、識別子を2つの別々のトークンに分割します。これは、すべての前処理およびC言語トークン2に当てはまります。

ただし、単項演算子とそのオペランドの間、#またはと前処理ディレクティブとその引数の間など、通常とは異なる場所にコメントを挿入できることに注意してください。

ただし、上記のマクロ定義は、関数のようなマクロではなく、にSTAT展開される通常のマクロを定義します( a ) - 1

他のトークンと同様に、変数名はエスケープされた改行によって分割できます。エスケープされた改行はシーケンスであるか、\直後に改行が続きます。これらのシーケンスは、プログラム変換のフェーズ2でソースコードから削除されます。それらの主な目的は、複数行の長いマクロ定義を分割することです。

以下は、同じ14個のトークンを生成するコードフラグメント3です。

コードカラーライザーがスライスおよびダイシングされたキーワードとコメントを見逃したことに注意してください:)


1)この動作はANSI-C、別名C89で指定されています。一部の古代のコンパイラは、トークンの貼り付けをもたらす微妙に異なる動作をしていましたが、そのような特殊性は歴史的な関心のみです。

2)隣接する文字列定数がプログラム変換のフェーズ6で連結されるという事実を利用することにより、文字列定数内にコメントをほぼ挿入できます。 printf("Hello "/* my name is Luca */"world!\n");

3)このクリスマスツリーのプレゼンテーションスタイルは、実際のプログラムで使用するためのものではなく、Cの入力処理機能を悪用する方法を示しています。より精巧なトリックが国際難読化Cコードコンテストに勝ちました


末尾の空白またはその欠如が意味的に重要であり、一部のテキストファイル形式では意味がない状況が他にないことを考えると、なぜ標準では行継続バックスラッシュ文字を他の空白文字で改行から分離しないことが要求されているのでしょうか。空白で終わる行とそうでない行を区別できますか?
スーパーキャット

@supercat:同意します。これは、行末としてCR LFシーケンスを使用するレガシーシステムからのファイルの場合もカバーし、\r前にを含むエスケープされた改行を認識しないUNIXシステムでコンパイルエラーを引き起こし\nます。ただし、これが裏目にconst char *path = "C:\\"; // the default path is C:\ 
出る

標準では、テキストファイルが行末の空白文字をサポートできる必要はありません。The path is "C:\"コードの意味を持つよりも良いと思われるようなコメントを書くことは、末尾の改行に依存します。
スーパーキャット

1
この動作が文書化されている限り、無視されることが多い変換フェーズ1では、すべての行から末尾の空白を削除できるため、標準ではそのような要件はありません。
zwol

4
この答えは、愚かな質問がないことを証明するためだけに、大いに役立ちます。よくやった。
Overbryd

65

語彙の観点からは、コメントは空白と同じです。

語彙要素に関するC標準のセクション6.4p3は次のように述べています。

...前処理トークンは空白で区切ることができます; これは、コメント(後述)、空白文字(スペース、水平タブ、改行、垂直タブ、およびフォームフィード)、あるいはその両方で構成されます。..。

より具体的には、コメントは単一のスペースに翻訳されます。これはセクション5.1.1.2p3で指定されています。

ソースファイルは、前処理トークンと空白文字のシーケンス(コメントを含む)に分解されます。ソースファイルは、部分的な前処理トークンまたは部分的なコメントで終わってはなりません。 各コメントは1つのスペース文字に置き換えられます。 改行文字は保持されます。改行以外の空白文字の空でない各シーケンスを保持するか、1つのスペース文字に置き換えるかは、実装によって定義されます。

これを説明するために、コードをプリプロセッサに渡すと、次のようになります。

したがって、空白のようなコメントは、トークンを区切るのに役立ちます。

これは、コードに13ではなく14のトークンが含まれることを意味します。


26

結果はあなたが書いたかのようになります:

しない:


12

翻訳(別名コンパイル)フェーズ3、ステップ2:「各コメントは1つのスペース文字に置き換えられます」を参照してください。

したがって、概念的にi/*nt*/ai a、その時点になります。


コメントは詳細な議論のためのものではありません。この会話はチャットに移動さました
Machavity

1

コードの形式を確認するだけです

前処理後にあります。コンパイラに「-E」フラグgcc-E myscript.cを追加するだけで、次の結果が得られます。

そして明らかに、あなたは間違いがあると結論付けることができます。


-9

はい、できます。コメントはコンパイラによってスキップされます。それらは変数に影響を与えません。コメントタグを終了することを忘れないでください。


5
「変数には影響しません。同じになります」と同じi aまたはia
HolyBlackCat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.