试试这段代码:
int main()
{
if(printf("%c",59)) //59 is ascii value of semicolon
{}
}
Run Code Online (Sandbox Code Playgroud)
我不相信有任何100%便携的方式来做到这一点.
对于使用基于ASCII或基于EBCDIC的字符编码的任何符合标准的托管C实现,以下内容应该具有明确定义的行为:
#include <stdio.h>
int main(void) {
if ('z' - 'a' == 25) {
if (printf("%c\n", 59)) { }
}
else {
if (printf("%c\n", 94)) { }
}
}
Run Code Online (Sandbox Code Playgroud)
我相信,这也是有效的C++,虽然不是很好的 C++(我会使用std::cout和更改(void)到()).
笔记:
#include <stdio.h>是避免printfC90中的调用未定义行为所必需的.在C99或更高版本中,printf没有可见声明的调用是违反约束的.'\n'避免未定义行为是必要的一些实现.它是实现定义的,文本流是否需要'\n'在最后一行的末尾.对于需要它的实现,未提供一个具有未定义的行为.return语句会导致main将未定义的终止状态返回给环境.在C99或更高版本中,它相当于return 0;.('z' - 'a' == 25)测试旨在检测ASCII与EBCDIC.在ASCII中,26个小写字母是连续的; 在EBCDIC,他们不是.对于使用与ASCII或EBCDIC不兼容的字符集的实现,此程序将失败.添加一些测试可以允许检测到这样的字符集,但是没有好的方法来处理它们(除非你碰巧知道如何';'编码).我从来没有听说过使用与ASCII或EBCDIC不兼容的字符集的C实现(至少就这些特定字符而言),所以这在实践中应该不是问题.94用于;源自这个维基百科文章.当然除了作为一个有趣的谜题之外,没有其他理由这样做.像"不使用分号"这样的限制在现实世界的编程中毫无意义.即使您的分号键被破坏,您也可以从其他来源复制并粘贴分号,直到您可以修复或更换键盘.但是,如果你需要生成一个可以复制和粘贴的分号,这个程序可能会很有用.幸运的是,大多数操作系统都允许您编辑,编译和运行简单的C程序,而无需使用分号键.
尝试这个。在C ++和C(C99模式)下均可工作:
int main( void )
{
if(putchar(59)){}
}
Run Code Online (Sandbox Code Playgroud)
说明:对分号使用ASCII代码,59并且为了避免分号,将语句putchar(59)放入if带有空主体的的条件表达式中。当条件表达式求值后,它将打印;。这里注意,返回类型main是int,但我回到没什么用避免;在return语句,因为你可以省略return 0;从main按照C99规范。
请参见此处的运行代码:C99,C ++。