面试官要求我编写代码来打印分号而不在代码中使用分号。这怎么可能呢?
答案 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)
更改为()
)。
注意:
#include <stdio.h>
以避免printf
次调用的未定义行为。在C99或更高版本中,调用printf
没有可见声明是违反约束。'\n'
是必要的,以避免某些实现上的未定义行为。它是实现定义的,文本流是否在最后一行的末尾需要'\n'
。对于需要它的实现,未能提供一个具有未定义的行为。return
语句会导致main
向环境返回未定义的终止状态。在C99或更高版本中,它相当于return 0;
。('z' - 'a' == 25)
测试旨在检测ASCII与EBCDIC。在ASCII中,26个小写字母是连续的;在EBCDIC,他们不是。对于使用与ASCII或EBCDIC不兼容的字符集的实现,此程序将失败。添加一些测试可以允许检测到这样的字符集,但是没有好的方法来处理它们(除非您碰巧知道';'
是如何编码的)。我从来没有听说过使用与ASCII或EBCDIC不兼容的字符集的C实现(至少就这些特定字符而言),所以这在实践中应该不是问题。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规范
请在此处查看正在运行的代码:C99,C++。
答案 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);