如何在 C# 中打印 n 次 n 没有循环、递归或 goto
How to print n times n without loops, recursivity or goto in C#
我在 c++ 中有这段代码来执行此操作,但我想在 C# 中做同样的事情,但它不起作用,我无法弄清楚为什么?
class Numero
{
public:
static int num;
Numero()
{
cout<<num++<<" ";
}
};
int Numero::num=1;
int main()
{
int n;
cout<<"Type n: ";
cin>>n;
Numero obj[n];
return 0;
}
这张印刷品"1 2 3 4 5 ....n" 但在 C# 中
class numero
{
public static int num {get; set;}
public numero()
{
Console.WriteLine(num);
num++;
}
}
class Program
{
static void Main(string[] args)
{
numero.num=1;
Console.WriteLine("Type 'n'");
int n = int.Parse( Console.ReadLine());
Console.WriteLine("Printing to: {0}", n);
numero[] num_1 = new numero[n];
Console.WriteLine("End");
Console.ReadLine();
}
}
我以不同的方式尝试过,但我唯一得到的是:
Type 'n' 10 Printing to: 10 End
知道如何使其工作的任何想法吗? 为什么在创建类 numero 时它不调用 numero constuctor??
C++ 版本之所以有效,是因为您在堆栈上分配了许多Numero
元素n
这会导致编译器调用Numero
的构造函数n
次。最终,您的程序仍在使用循环,但它隐藏在生成的机器代码中,而不是在您的代码中显式删除。
编译器生成的机器代码的伪代码类似于这样:
numbers = Allocate( n * sizeof( Number ) );
for(int i=0;i<n;i++) numbers[i].ctor();
这在纯 C# 中是不可能的,因为类存在于堆上并且需要显式构造函数调用(您必须在循环中执行此操作),并且虽然结构存在于堆栈(某种程度上),但它们在分配时不会调用其默认构造函数(有关说明,请参阅此 QA:为什么我不能为 .NET 中的结构定义默认构造函数?
你的问题听起来像是一个糟糕的脑筋急转弯问题,它测试一个人对语言的熟悉程度,但实际用途为零,因为实现循环的唯一方法是在某处使用跳转指令(无论是循环、递归调用还是显式 goto;没有其他方法可以做到这一点 - 隐藏它的唯一方法是调用另一个执行禁止指令的方法或编译器功能)。
请注意,您可以使用Array.Initialize
来执行此操作,这将调用值类型数组元素的默认构造函数,但 C# 不允许定义这样的默认构造函数(但 CLI 确实允许它们存在)。但是,这可能是为了允许某些托管C++/C++/CLR 互操作功能。
相关文章:
- 为什么在递归中使用循环会产生意想不到的结果?
- 无穷大而循环时具有递归函数
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- C++ 模板使用递归实现循环
- C++ 使用递归而不是 for 循环
- 递归应用 C++20 范围适配器会导致编译时无限循环
- 为什么这个递归函数会创建一个无限循环?
- 如何使用循环编写此递归
- 计算递归和时的无限循环
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- C++ 循环链表的递归基本情况
- 循环访问多个模板参数的递归模板函数
- 在 C++ 中用递归替换循环的 N 级
- 视觉 在C++中,我试图在没有递归的情况下循环访问许多对象
- C 递归函数无限循环
- 转换循环以递归基本方法
- 编译器无法在循环递归参考中找到功能
- 使用 for 循环递归地乘以数组中的元素
- 嵌套for循环递归