_did_ C运算符/ \和\ /做什么?

Nev*_*DNZ 34 c compiler-construction history operators algol

任何人都可以在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);
...
}
Run Code Online (Sandbox Code Playgroud)


实际实现: / \和\ /运算符可以追溯到第六版Unix 1975(到目前为止).例子:Unix的V6(1975),Unix的V7(1979)和多个当前BSD 2.11(1992- 2008年)

Tam*_*ege 18

在ISO C89标准中,/ \和/都没有定义为运算符,我认为它们在任何早期版本中都没有定义过.据我所知,它们在C99中肯定没有定义.

这是ANSI C89标准的草案,供参考:http://flash-gordon.me.uk/ansi.c.txt

(你可能是一些奇怪的奥术预处理器魔法的受害者)

  • +1用于奇怪的奥术预处理器魔法.这看起来像你在IOCCC条目中看到的那种东西. (7认同)

Sin*_*nür 14

\/看起来像sup/\看起来像inf.它们也可以分别是.

我不记得在K&R第二版或任何其他C书中看过这些.

  • "互联网"说,'Bob Bemer'将字符添加到ASCII中,专门用于允许/ \和\ /运算符.cf http://home.ccil.org/~remlaps/www.bobbemer.com/BRACES.HTM - 有时候 - 甚至到今天 - MIN和MAX都是用C实现的,有着不稳定的副作用:例如#define MIN(a ,b)((a <b)?(a):( b)) (7认同)
  • 您可能猜对了:我在Unix V6和V7中都发现了/ \和\ /运算符的实现.(http://www.bitsavers.org/bits/Interdata/32bit/unix/univWollongong_v6/interdata_v6/usr/source/c/c00.c&http://stuff.mit.edu/afs/sipb/project/v7unix /fs/usr/src/cmd/c/c00.c).我看来K&R在写旧约时忘了记录/ \和\ /.现在我需要知道的是TH是Wollongong的地方吗?;-) (5认同)
  • 这让我想起了被弃用的<?和>?(最小和最大)运算符及其赋值变量<?=和>?= G ++曾经允许并且我遇到了不幸. (3认同)

Jon*_*ler 10

炒作!

如果你周围有空格,那么:

a /\ b   ===>   a / b

a \/ b   ===>   a / b
Run Code Online (Sandbox Code Playgroud)

逻辑:预处理阶段必须处理反斜杠和后面的字符,并且很可能将反斜杠空格视为空格,反斜杠斜杠作为斜线处理.

也就是说,SUN C编译器(版本12)和GNU C编译器(版本4.4)都拒绝包含反斜杠的代码.但我可以很容易地相信旧的,预标准的C预处理器不那么小心.

符合标准

运营商从未成为C官方版本的一部分.

此外,该标准不允许我给出的解释(第5.1.1.2节翻译阶段,在C89和C99中) - 但非标准编译器当然不受标准的约束.


在发布源之后添加:

有趣!所以看起来似乎有理由' a = b /\ c;'将b和c a = b \/ c;的最大值分配给a,并且' '做最小值(或者,正如Greg Hewgill指出的那样,反之亦然).而且,在那些日子里,这是可能的,现代的" +="运营商仍然写为" =+" 和实际上是两个标记(此说法没有证据支持;再次失败内存),所以假设" a =/\ b;"(或者,在现代符号,' a /\= b;')将是最大赋值运算符等.

在我看来,汤普森的ACM图灵奖演讲" 信任信任思考 "在某种程度上是相关的.

  • 如果有人在我需要维护的代码中执行此操作,他们最好离开该州... (10认同)
  • `\ /`用于`sup`和`/ \\`用于`inf`是建立的数学符号.另见http://en.wikipedia.org/wiki/Lattice_%28order%29 (5认同)

Cri*_*omo 6

我不确定\/,但它/\是一个有效的结构.它用于将单行注释的两个斜杠放在单独的行上.例如:

/\
/ Comment content
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为反斜杠字符会转义换行符,并且解析器会继续,就好像它不存在一样.如果反斜杠后面有空格或第二个正斜杠缩进,则无效.因此,可以像你一样逃避任意数量的换行符

/\
\
\
\
\
/ Still a legal comment.
Run Code Online (Sandbox Code Playgroud)

反斜杠也可以在常规单行注释的末尾使用,以使它们继续到下一行,如

// Yet another comment \
This line is in the comment \\
And so is this one!
Run Code Online (Sandbox Code Playgroud)

  • 当我浏览C99标准时,我看到了这一点,并想:"嘿,这很酷!......而且大多没用." (3认同)