[C语言]

老鸟高分求教C语言双问号转义字符的原理

[复制链接]
2318|21
手机看帖
扫描二维码
随时随地手机跟帖
oayzw| | 2017-2-4 10:38 | 显示全部楼层
本帖最后由 oayzw 于 2017-2-4 10:49 编辑

教授们一般不搞小测验啊,不记得有双问号转义
Keil 最常见可能之一:
代码是在别的地方中拷贝来的,与ide编码方式不同,例如??处原本是汉字

使用特权

评论回复
icecut| | 2017-2-4 12:00 | 显示全部楼层
没有这语法啊

使用特权

评论回复
ddllxxrr| | 2017-2-4 12:05 | 显示全部楼层
如果两个问号那里不编译出错,结果应是38

使用特权

评论回复
通宵敲代码| | 2017-2-4 12:19 | 显示全部楼层
神奇的一笔

使用特权

评论回复
xhx331153066| | 2017-2-4 13:22 | 显示全部楼层
??/   等于  \   

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
linqing171 + 5 淡定
linqing171|  楼主 | 2017-2-4 17:07 | 显示全部楼层
哈哈,今天来公司,公司里面装的软件多。亲测我司正版的 Borland C++ Builder 2007,和免费的社区版的 Microsoft Visual C++ 2010也均是一模一样的结果。然后GCC也是。Visual studio和eclipse的智能感知正确,keil使用的scint的智能感知错误。 IAR试用版过期了没有测试。

所以这个 ??/ 变为 \ 的要求,应该是C标准中的,晚上回去查一下标准。 昨天夜里搜了一下百度,没有找到,估计谭教授写的书上也没有。

使用特权

评论回复
linqing171|  楼主 | 2017-2-4 17:09 | 显示全部楼层

是的,第一次见。

使用特权

评论回复
linqing171|  楼主 | 2017-2-4 17:09 | 显示全部楼层
ddllxxrr 发表于 2017-2-4 12:05
如果两个问号那里不编译出错,结果应是38

报告版主,测了几个编译器都是一样的结果,不是38。。。

使用特权

评论回复
icecut| | 2017-2-4 17:53 | 显示全部楼层
linqing171 发表于 2017-2-4 17:09
报告版主,测了几个编译器都是一样的结果,不是38。。。

你是说把??/删了就是38了?

使用特权

评论回复
linqing171|  楼主 | 2017-2-4 18:04 | 显示全部楼层
C99 标准中的原文摘录:
5.2.1.1 Trigraph sequences
All occurrences in a source file of the following sequences of three characters (called
trigraph sequences12)) are replaced with the corresponding single character.
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~
No other trigraph sequences exist. Each ? that does not begin one of the trigraphs listed
above is not changed.

EXAMPLE The following source line
printf("Eh???/n");
becomes (after replacement of the trigraph sequence ??/)
printf("Eh?\n");




截图:

Trigraph.png

使用特权

评论回复
linqing171|  楼主 | 2017-2-4 18:04 | 显示全部楼层
本帖最后由 linqing171 于 2017-2-4 18:10 编辑
icecut 发表于 2017-2-4 17:53
你是说把??/删了就是38了?

代码中的 ??/  删不删没有关系。注释中的 ??/ 不删是20,删了是38.  
??/ 三字母替换成  \ 后, 注释最后面的变为\ ,后面紧跟着的回车被转义为续行符了(等待教授指正,是否直接就是续行符,暂时没有查标准)。下行内容被注释,keil编辑界面还显示颜色(eclipse和VS等IDE均显示为注释)

另外,测试C#没有此语法,java就不测了,可能也是没有的。

使用特权

评论回复
frank_ic| | 2017-2-4 22:12 | 显示全部楼层
linqing171 发表于 2017-2-4 18:04
C99 标准中的原文摘录:
5.2.1.1 Trigraph sequences
All occurrences in a source file of th ...

C89就这样,乌龟的屁股叫规定,没啥原理。
只是时不时就有人说是发现编译器的BUG了……

使用特权

评论回复
renxiaolin| | 2017-2-5 09:21 | 显示全部楼层
我编译没通过

使用特权

评论回复
renxiaolin| | 2017-2-5 09:24 | 显示全部楼层
是我代码写的有问题 ?
捕获.PNG

使用特权

评论回复
linqing171|  楼主 | 2017-2-5 12:43 | 显示全部楼层
renxiaolin 发表于 2017-2-5 09:24
是我代码写的有问题 ?

代码写的没有问题,编译不通过的提示信息是什么错误? 你用的什么开发环境? Turbo C2.0?
是不是volatile不支持? 你在while之前是不是想printf一下?

使用特权

评论回复
renxiaolin| | 2017-2-5 13:40 | 显示全部楼层
linqing171 发表于 2017-2-5 12:43
代码写的没有问题,编译不通过的提示信息是什么错误? 你用的什么开发环境? Turbo C2.0?
是不是volati ...

我是直接在ubuntu上试的,
捕获1.PNG
捕获.PNG

使用特权

评论回复
linqing171|  楼主 | 2017-2-5 21:18 | 显示全部楼层
renxiaolin 发表于 2017-2-5 13:40
我是直接在ubuntu上试的,

看warning,在makefile里给gcc加个 -trigraphs 就可以了。

使用特权

评论回复
renxiaolin| | 2017-2-6 09:00 | 显示全部楼层
linqing171 发表于 2017-2-5 21:18
看warning,在makefile里给gcc加个 -trigraphs 就可以了。

那你能看看error不

使用特权

评论回复
mcu5i51| | 2017-2-8 15:39 | 显示全部楼层
据说是以前的部分键盘不全,用这个方法输入一些符号;所以比较新的编译器是没有的,C属于遗传

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:I find it amusing that you didn't even consider a third reason for the problem was an error on your part.

53

主题

2855

帖子

15

粉丝