Nev*_*DNZ 34 c compiler-construction history operators algol
任何人都可以在C中"声明"自己的运算符....也就是说,如果一个人是C编译器大师并拥有C编译器的源代码!;-)
进一步的疑问:
谷歌搜索"/\\ /"自然不会返回任何内容.维基百科的页面既不是/ \也不是\ /.但我发现表格类似的运算符内置于XML字符实体中!
/*
* 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)
Tam*_*ege 18
在ISO C89标准中,/ \和/都没有定义为运算符,我认为它们在任何早期版本中都没有定义过.据我所知,它们在C99中肯定没有定义.
这是ANSI C89标准的草案,供参考:http://flash-gordon.me.uk/ansi.c.txt
(你可能是一些奇怪的奥术预处理器魔法的受害者)
Sin*_*nür 14
\/看起来像sup和/\看起来像inf.它们也可以分别是∨和
∧.
我不记得在K&R第二版或任何其他C书中看过这些.
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图灵奖演讲" 信任信任的思考 "在某种程度上是相关的.
我不确定\/,但它/\是一个有效的结构.它用于将单行注释的两个斜杠放在单独的行上.例如:
/\
/ 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)