打印
[C语言]

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

[复制链接]
2737|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第一步,问执行完后i等于几。
第二步,上代码。
void main()
{
volatile unsigned char i=9;
//this is a test ??/
i=i*2;
i++; ??/
i=i*2;
while(1)
{
}
}
第三步,上图片。


要讲的清楚啊。

相关下载

相关帖子

沙发
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

使用特权

评论回复
5
通宵敲代码| | 2017-2-4 12:19 | 只看该作者
神奇的一笔

使用特权

评论回复
6
xhx331153066| | 2017-2-4 13:22 | 只看该作者
??/   等于  \   

使用特权

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

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

使用特权

评论回复
8
linqing171|  楼主 | 2017-2-4 17:09 | 只看该作者

是的,第一次见。

使用特权

评论回复
9
linqing171|  楼主 | 2017-2-4 17:09 | 只看该作者
ddllxxrr 发表于 2017-2-4 12:05
如果两个问号那里不编译出错,结果应是38

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

使用特权

评论回复
10
icecut| | 2017-2-4 17:53 | 只看该作者
linqing171 发表于 2017-2-4 17:09
报告版主,测了几个编译器都是一样的结果,不是38。。。

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

使用特权

评论回复
11
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");




截图:


使用特权

评论回复
12
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就不测了,可能也是没有的。

使用特权

评论回复
13
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了……

使用特权

评论回复
14
renxiaolin| | 2017-2-5 09:21 | 只看该作者
我编译没通过

使用特权

评论回复
15
renxiaolin| | 2017-2-5 09:24 | 只看该作者
是我代码写的有问题 ?

捕获.PNG (21.1 KB )

捕获.PNG

使用特权

评论回复
16
linqing171|  楼主 | 2017-2-5 12:43 | 只看该作者
renxiaolin 发表于 2017-2-5 09:24
是我代码写的有问题 ?

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

使用特权

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

我是直接在ubuntu上试的,

捕获1.PNG (19.75 KB )

捕获1.PNG

捕获.PNG (25.08 KB )

捕获.PNG

使用特权

评论回复
18
linqing171|  楼主 | 2017-2-5 21:18 | 只看该作者
renxiaolin 发表于 2017-2-5 13:40
我是直接在ubuntu上试的,

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

使用特权

评论回复
19
renxiaolin| | 2017-2-6 09:00 | 只看该作者
linqing171 发表于 2017-2-5 21:18
看warning,在makefile里给gcc加个 -trigraphs 就可以了。

那你能看看error不

使用特权

评论回复
20
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

主题

2875

帖子

15

粉丝