C++ 如何打印分号(;),而不在程序中使用分号?
一位面试官要求我编写代码,在代码中不使用分号的情况下打印分号。这怎么可能呢?这是一个更为C++的版本:C++ 如何打印分号(;),而不在程序中使用分号?,c++,c,C++,C,一位面试官要求我编写代码,在代码中不使用分号的情况下打印分号。这怎么可能呢?这是一个更为C++的版本: #包括 int main(){ (STD::CUT试试)。在C++和C(C99模式)中工作: 说明:分号使用ASCII码,分号为59,为避免分号,请将语句putchar(59)放入在if的条件表达式中使用空体。当条件表达式求值时,它将打印;。这里注意main的返回类型是int,但我不返回任何内容,以避免在return语句中使用;,因为您可以省略返回0;frommain符合C99规范。 请参见此
#包括
int main(){
(STD::CUT试试)。在C++和C(C99模式)中工作:
说明:分号使用ASCII码,分号为59
,为避免分号,请将语句putchar(59)放入
在if
的条件表达式中使用空体。当条件表达式求值时,它将打印;
。这里注意main
的返回类型是int
,但我不返回任何内容,以避免在return
语句中使用;
,因为您可以省略返回0;
frommain
符合C99规范。
请参见此处的运行代码:,。尝试以下代码:
int main()
{
if(printf("%c",59)) //59 is ascii value of semicolon
{}
}
我不相信有任何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)) { }
}
}
#包括
内部主(空){
如果('z'-'a'==25){
如果(printf(“%c\n”,59)){}
}
否则{
如果(printf(“%c\n”,94)){}
}
}
我相信它也是有效的C++,虽然不是很好的C++(我会用<代码> STD::CUT),并且改变<代码>(空)<代码> > <代码>()/> > < <
注:
#include
对于避免C90中的printf
调用上的未定义行为是必需的。在C99或更高版本中,调用没有可见声明的printf
是违反约束的
'\n'
对于避免某些实现上的未定义行为是必需的。文本流是否需要最后一行末尾的'\n'
是由实现定义的。对于需要它的实现,如果未能提供,则具有未定义的行为
- 在C90中,省略
return
语句会导致main
向环境返回未定义的终止状态。在C99或更高版本中,它相当于return 0;
('z'-'a'==25)
测试旨在检测ASCII与EBCDIC。在ASCII中,26个小写字母是连续的;在EBCDIC中,它们不是连续的。对于使用与ASCII或EBCDIC不兼容的字符集的实现,此程序将失败。添加一些测试可能允许检测此类字符集,但没有好的方法我从来没有听说过一个C实现使用的字符集与ASCII或EBCDIC都不兼容(至少就这些特定字符而言),所以这在实践中不应该是一个问题
- 我还没有在EBCDIC实现上测试过这一点。
的值94
;
是从中派生出来的
当然,除了作为一个有趣的谜题,没有什么好的理由这么做。像“不要使用分号”这样的限制在现实编程中没有任何意义。即使分号键已损坏,您也可以从其他来源复制和粘贴分号,直到您可以修复或更换键盘。但如果您需要生成可以复制和粘贴的分号,此程序可能会很有用。幸运的是,大多数操作系统都应该允许您编辑、复制和粘贴分号mpile,运行一个简单的C程序,而不需要使用分号键。我知道的三种方法可以获得与
printf(";");
putchar(';');
printf("%c",';');
它们(对应)如下
printf("\u003B");
putchar(0x3B);
printf("%c",0x3B);
使用ascii码:这个问题对于stackoverflow来说太宽泛了,有无数种方法可以打印;
,而无需在源代码中明确说明。只有知道答案时才宽泛。OP显然不是这样,所以我们应该启发他,而不是责骂他。我认为专业和热心的开发人员应该现在99.99%的处理器只处理二进制指令和数据,所以更好的问题是“如何打印分号(;)使用一个不理解分号的处理器。这怎么可能呢?’这是一个诚实的问题,不是一场竞赛。OP显然不知道字符可以用其他方式表示。这可能是一个很好的暗示,让面试官知道OP是一个没有经验的开发人员,但我们仍然可以启发他。我发现你缺少家长“昆廷很不安。”这种干扰只是一个错误。好的C++可能使用分号,而不是空块。P@djechlin:咯咯笑——但是任何语言中的“好”代码都需要解决它应该解决的问题。你能可靠地预测一个接近分号的字符吗?例如:“:”-1如果你输出程序“int main(){返回0$char}”如果$char在1、…、255上迭代,请尝试编译它,然后查看编译的是哪一个。@djechlin:否。标准仅保证'0'
。'9'
是连续的,并且基本执行字符集的所有成员都是非负的。您可以映射出基本执行字符集的所有成员,而不是';
但这只会将“”;“
的可能值缩小到几种可能性。(在实践中,假设ASCII或EBCDIC可能涵盖100%的实际实现。)您不应该使用分号(;)在代码中。你的意思是不结束一个陈述吗?你错过了问题的全部要点!!其他答案解决了它。
printf(";");
putchar(';');
printf("%c",';');
printf("\u003B");
putchar(0x3B);
printf("%c",0x3B);