34

誰でも C で独自の演算子を「宣言」することができます...つまり、C コンパイラの第一人者であり、C コンパイラのソース コードを持っている場合です! ;-)

困惑するさらなる質問:

  1. これらの操作は C99 でどのように行われますか? gcc? ...
  2. /\ & \/ が削除されたのはなぜですか?
  3. /\ および \/ 演算子はどのタイプに有効でしたか?

「/\ \/」をグーグルで検索しても、当然何も返されません。ウィキペディアには、/\ と \/ のどちらのページもありません。しかし、同様の演算子が XML 文字エンティティに組み込まれていることを発見しました!


ソースが追加されました: PDP の cc ソース ファイル "c00.c" で問題のある例を見つけました。

/*
 * Return the next symbol from the input.
 * peeksym is a pushed-back symbol, peekc is a pushed-back
 * character (after peeksym).
 * mosflg means that the next symbol, if an identifier,
 * is a member of structure or a structure tag or an enum tag
 */
symbol()
{
...
 case BSLASH:
  if (subseq('/', 0, 1))
   return(MAX);
  goto unkn;

 case DIVIDE:
  if (subseq('\\', 0, 1))
   return(MIN);
  if (subseq('*',1,0))
   return(DIVIDE);
...
}


実際の実装: /\ および \/ 演算子は、 Sixth Edition Unix 1975 (これまで のところ) までさかのぼります。例: Unix V6 (1975)、Unix V7 (1979)、現在はBSD 2.11 (1992- 2008 )

4

8 に答える 8

18

/\も/もISOC89標準では演算子として定義されておらず、以前のバージョンでは定義されていなかったと思います。そして、私が知る限り、それらはC99では絶対に定義されていません。

参考までに、ANSIC89規格のドラフトを次に示します。http://flash-gordon.me.uk/ansi.c.txt

(あなたは恐らく奇妙な難解なプリプロセッサの魔法の犠牲者です)

于 2009-10-08T22:41:06.157 に答える
14

\/のようsup/\見えinfます。それぞれ∨の場合もあります。

これらを K&R 第 2 版や他の C の本で見たことを覚えていません。

于 2009-10-08T22:53:04.943 に答える
10

投機!

それらの周りにスペースがある場合は、次のようになります。

a /\ b   ===>   a / b

a \/ b   ===>   a / b

ロジック: 前処理フェーズでは、バックスラッシュとその後の文字を処理する必要があり、バックスラッシュとスペースをスペースとして、バックスラッシュとスラッシュをスラッシュとして扱う可能性が非常に高くなります。

つまり、SUN C コンパイラ (バージョン 12) と GNU C コンパイラ (バージョン 4.4) の両方が、バックスラッシュを含むコードを拒否します。しかし、標準化以前の古い C プリプロセッサは、これにあまり注意を払っていなかったと簡単に信じられます。

規格準拠

演算子は、C の公式バージョンの一部ではありません。

また、標準は私が示した解釈を許可しません (セクション 5.1.1.2 C89 と C99 の両方での変換フェーズ) - もちろん、非標準コンパイラは標準によって制約されません。


ソースが投稿された後に追加されました:

面白い!a = b /\ c;したがって、' ' が b と c の最大値を a に割り当て、' ' が最小値を割り当てるのはもっともらしく見えa = b \/ c;ます (または、Greg Hewgill が指摘したように、その逆の可能性が高い)。そして、当時、現代の ' ' 演算子はまだ ' ' と書かれていて、実際には 2 つのトークンであった可能性がありまし+==+(この主張を裏付ける証拠はありません; 再び記憶喪失です) 。a =/\ b;表記、' a /\= b;') は最大代入演算子などでした。

また、トンプソンの ACM チューリング賞のスピーチ ' Reflections On Trusting Trust ' が何らかの形で関連していることも思い浮かびます。

于 2009-10-08T22:48:58.660 に答える
6

についてはわかりません\//\、有効な構成です。1 行コメントの 2 つのスラッシュを別々の行に配置するために使用されます。例えば:

/\
/ Comment content

バックスラッシュ文字が改行をエスケープし、パーサーがそこにないかのように続行するため、これは機能します。バックスラッシュの後にスペースがある場合、または 2 番目のスラッシュがインデントされている場合、これは機能しません。このため、次のように、好きなだけ改行をエスケープすることができます。

/\
\
\
\
\
/ Still a legal comment.

次のように、バックスラッシュを通常の 1 行のコメントの最後に使用して、コメントを次の行に継続させることもできます。

// Yet another comment \
This line is in the comment \\
And so is this one!
于 2009-10-08T23:05:29.490 に答える
3

Cにはこれらの演算子がありません。

通常、/は一部の文字列システムではエスケープコードになりますが、/\に意味があるかどうかはわかりません。

于 2009-10-08T22:43:38.743 に答える
3

彼らが何かを意味したとは思えません。もしそうなら、それはずっと前のことです。私が知っている C から削除された唯一の主要な演算子は =+ と =- で、これらは += と -= の初期の同義語でした。証拠として、DMR のPrimeval C Pageを参照してください。

于 2009-10-08T22:50:33.713 に答える
3

これらは形式的なシンボリック ロジックへの参照であると推測します。

http://en.wikipedia.org/wiki/Table_of_logic_symbols

/ は、論理和 (OR) を表すために使用されます。/\ は、論理積 (AND) を表すために (あまり使用されません) 使用されます。

于 2009-10-08T23:58:13.887 に答える
1

キャレット ( ^) は、ビット単位の排他的 OR を実行します。

「V」演算子があるとは思わない。それは文字「V」です(または、それに非常によく似ているもの)。誰かが変数に名前を付けたいと思うかもしれません。

于 2009-10-08T22:47:57.257 に答える