C语言嵌套注释问题
2011-11-07 23:56
218 查看
问题来源:《C陷阱与缺陷》
练习1-1. 某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。
提示:被双引号括起来的字符串中,注释符/*属于字符串的一部分,而在注释中出现的双引号又属于注释的一部分。
我的解答如下:
首先我们必须找一串符号序列,它满足在不同的编译器下都是合法的,但意义不同。而要形成嵌套注释,则这串序列必须至少含有这样的字符:/*/**/*/。
我们先从/*/**/开始讨论。对允许嵌套注释的编译器,/*/**/后面的字符都是注释的一部分,而对不允许注释的编译器,这就是一个完整的注释了。
然后我们在后面加上"*/",变成/*/**/"*/"。对允许嵌套注释的编译器,/*/**/"*/"等效于一个引号;对不允许注释的编译器/*/**/"*/"等效于字符串"*/"。此时对允许嵌套注释的编译器无法通过编译,即剩下一个引号,我的想法是把这个引号给注释掉,由于是在C++的编译器,我直接就在引号前面添加了两干,变成/*/**/"*///",有点投机取巧的意味。
但用C的注释符也是可以的,在/*/**/"*/"后面加上/*"变成/*/**/"*/"/*"。对允许嵌套注释的编译器,/*/**/"*/"/*"等效于字符串"/*";对不允许注释的编译器,/*/**/"*/"/*"等效于字符串和一个不完整的注释"*/"/*"。
最后可以在后面加上/**/完成注释。故最终的字符串为/*/**/"*/"/*"/**/。
在作者的解答里面有一个很神奇神奇的答案:/*/*/0*/**/1
大家就自己分析下啦!挺有趣的!
以下是最终写的程序的代码,包含以上提到的几种方案,很简单
#include <stdio.h>
#include <stdlib.h>
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;
}
练习1-1. 某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。
提示:被双引号括起来的字符串中,注释符/*属于字符串的一部分,而在注释中出现的双引号又属于注释的一部分。
我的解答如下:
首先我们必须找一串符号序列,它满足在不同的编译器下都是合法的,但意义不同。而要形成嵌套注释,则这串序列必须至少含有这样的字符:/*/**/*/。
我们先从/*/**/开始讨论。对允许嵌套注释的编译器,/*/**/后面的字符都是注释的一部分,而对不允许注释的编译器,这就是一个完整的注释了。
然后我们在后面加上"*/",变成/*/**/"*/"。对允许嵌套注释的编译器,/*/**/"*/"等效于一个引号;对不允许注释的编译器/*/**/"*/"等效于字符串"*/"。此时对允许嵌套注释的编译器无法通过编译,即剩下一个引号,我的想法是把这个引号给注释掉,由于是在C++的编译器,我直接就在引号前面添加了两干,变成/*/**/"*///",有点投机取巧的意味。
但用C的注释符也是可以的,在/*/**/"*/"后面加上/*"变成/*/**/"*/"/*"。对允许嵌套注释的编译器,/*/**/"*/"/*"等效于字符串"/*";对不允许注释的编译器,/*/**/"*/"/*"等效于字符串和一个不完整的注释"*/"/*"。
最后可以在后面加上/**/完成注释。故最终的字符串为/*/**/"*/"/*"/**/。
在作者的解答里面有一个很神奇神奇的答案:/*/*/0*/**/1
大家就自己分析下啦!挺有趣的!
以下是最终写的程序的代码,包含以上提到的几种方案,很简单
#include <stdio.h>
#include <stdlib.h>
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;
}
相关文章推荐
- 【C语言】注释不可以嵌套使用的举例
- 动态规划解最长公共子序列问题(LCS)C语言加注释
- 一个简单的C语言嵌套问题
- 动态规划解最长公共子序列问题(LCS)C语言加注释
- C语言宏嵌套问题
- C语言里的注释转换问题 (把C语言的的注释转换成C++的注释)
- C语言中,注释不能嵌套
- C语言编写注释转换问题
- 【C语言】注释不可以嵌套使用的举例
- 问题:注释嵌套
- 问题008:java 中代码块的风格有几种?单行注释可否嵌套?多行注释可否嵌套?
- 【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。
- c语言的一些问题
- C语言里面的嵌套声明的读法
- JSTL重定向标签注释不掉的问题
- 条件注释解决ie浏览器的兼容性问题
- C语言编程问题
- 浮动元素之间注释,导致多复制一个文字问题
- OpenJudge百炼-2692-假币问题-C语言-枚举
- C语言的问题求教