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

use*_*872 -6 c c++

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

BEC*_*OOL 8

试试这段代码:

int main()
{
    if(printf("%c",59)) //59 is ascii value of semicolon
    {}
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 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)) { }
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信,这也是有效的C++,虽然不是很好的 C++(我会使用std::cout和更改(void)()).

笔记:

  • #include <stdio.h>是避免printfC90中的调用未定义行为所必需的.在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用于;源自这个维基百科文章.

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


hac*_*cks 5

尝试这个。在C ++和C(C99模式)下均可工作:

int main( void )
{
    if(putchar(59)){}
}    
Run Code Online (Sandbox Code Playgroud)

说明:对分号使用ASCII代码,59并且为了避免分号,将语句putchar(59)放入if带有空主体的的条件表达式中。当条件表达式求值后,它将打印;。这里注意,返回类型mainint,但我回到没什么用避免;return语句,因为你可以省略return 0;main按照C99规范。
请参见此处的运行代码:C99C ++

  • 我发现您对括号的缺乏感到不安。 (3认同)
  • 我很高兴:p (2认同)