c语言注释不能嵌套什么意思,C语言嵌套注释问题

问题来源:《C陷阱与缺陷》

练习1-1.某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。

提示:被双引号括起来的字符串中,注释符/*属于字符串的一部分,而在注释中出现的双引号又属于注释的一部分。

我的解答如下:

首先我们必须找一串符号序列,它满足在不同的编译器下都是合法的,但意义不同。而要形成嵌套注释,则这串序列必须至少含有这样的字符:/*/**/*/。

我们先从/*/**/开始讨论。对允许嵌套注释的编译器,/*/**/后面的字符都是注释的一部分,而对不允许注释的编译器,这就是一个完整的注释了。

然后我们在后面加上"*/",变成/*/**/"*/"。对允许嵌套注释的编译器,/*/**/"*/"等效于一个引号;对不允许注释的编译器/*/**/"*/"等效于字符串"*/"。此时对允许嵌套注释的编译器无法通过编译,即剩下一个引号,我的想法是把这个引号给注释掉,由于是在C++的编译器,我直接就在引号前面添加了两干,变成/*/**/"*///",有点投机取巧的意味。

但用C的注释符也是可以的,在/*/**/"*/"后面加上/*"变成/*/**/"*/"/*"。对允许嵌套注释的编译器,/*/**/"*/"/*"等效于字符串"/*";对不允许注释的编译器,/*/**/"*/"/*"等效于字符串和一个不完整的注释"*/"/*"。

最后可以在后面加上/**/完成注释。故最终的字符串为/*/**/"*/"/*"/**/。

在作者的解答里面有一个很神奇神奇的答案:/*/*/0*/**/1

大家就自己分析下啦!挺有趣的!

以下是最终写的程序的代码,包含以上提到的几种方案,很简单

#include

#include

int main()

{

char* str=("hello world");

/*/**/str="*///hello world";

printf("%s\n",str);

str=/*/**/"*/"/*"/**/;

printf("%s\n",str);

int i = /*/*/0*/**/1;

printf("%d\n",i);

system("pause");

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值