如何在程序中不使用分号打印分号(;)?

时间:2014-06-04 16:42:34

标签: c++ c

面试官要求我编写代码来打印分号而不在代码中使用分号。这怎么可能呢?

5 个答案:

答案 0 :(得分:8)

我不相信有任何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)) { }
    }
}

我相信它也是有效的C ++,但不是 C ++(我使用std::cout并将(void)更改为())。

注意:

  • {C}需要#include <stdio.h>以避免printf次调用的未定义行为。在C99或更高版本中,调用printf没有可见声明是违反约束。
  • '\n'是必要的,以避免某些实现上的未定义行为。它是实现定义的,文本流是否在最后一行的末尾需要'\n'。对于需要它的实现,未能提供一个具有未定义的行为。
  • 在C90中,省略return语句会导致main向环境返回未定义的终止状态。在C99或更高版本中,它相当于return 0;
  • ('z' - 'a' == 25)测试旨在检测ASCII与EBCDIC。在ASCII中,26个小写字母是连续的;在EBCDIC,他们不是。对于使用与ASCII或EBCDIC不兼容的字符集的实现,此程序将失败。添加一些测试可以允许检测到这样的字符集,但是没有好的方法来处理它们(除非您碰巧知道';'是如何编码的)。我从来没有听说过使用与ASCII或EBCDIC不兼容的字符集的C实现(至少就这些特定字符而言),所以这在实践中应该不是问题。
  • 我没有在EBCDIC实现上测试过这个。 94的值;来自this Wikipedia article

当然除了作为一个有趣的谜题之外,没有其他理由这样做。像“不使用分号”这样的限制在现实世界的编程中毫无意义。即使您的分号键被破坏,您也可以从其他来源复制并粘贴分号,直到您可以修复或更换键盘。但是,如果你需要生成一个可以复制和粘贴的分号,这个程序可能会很有用。幸运的是,大多数操作系统都允许您编辑,编译和运行简单的C程序,而无需使用分号键。

答案 1 :(得分:7)

试试这段代码:

int main()
{
    if(printf("%c",59)) //59 is ascii value of semicolon
    {}
}

答案 2 :(得分:4)

试试这个。在C ++和C中工作(C99模式):

int main( void )
{
    if(putchar(59)){}
}    

说明:使用分号为59的ASCII代码并避免使用分号将putchar(59)语句放入if的条件表达式中空身。在评估条件表达式时,它将打印;。请注意,main的返回类型为int,但我不返回任何内容以避免在;语句中使用return,因为您可以从{{return 0;中省略main 1}}根据C99规范 请在此处查看正在运行的代码:C99C++

答案 3 :(得分:2)

这个(更多C ++版本):

#include <iostream>

int main() {
while ((std::cout<<static_cast<char>(59))== nullptr){}

}

(在ideone显然没有错误)

还是应该更有创意? :)

答案 4 :(得分:0)

我知道的三种方式可以获得与

相同的效果
printf(";");
putchar(';');
printf("%c",';');

是(对应)如下

printf("\u003B");
putchar(0x3B);
printf("%c",0x3B);