比较两个数字(大于、等于或小于)而不带 if 语句



我的C#编程书上有一项任务,我需要编写一个:

"从键盘读取两个数字并打印数字 1 是否大于、等于或小于数字 2 的程序。

我认为我不能使用 if 语句的原因是因为它们尚未被涵盖。这个任务是在本书教授if语句之前给出的。我一直在试图弄清楚这一点,我需要使用 ?算子。。?如果它只询问它是否小于或大于、小于或等于或等于或大于数字 2,那会很容易,但现在有 3 种不同的东西。

这本书已经教过了? 运算符,但不是比较。我不相信它让我猜测if语句的存在,因为其中的所有任务都应该能够完全用已经教过的东西来解决。不过,这本书将要教授if语句,基本上只是在这个任务的下一页。

这是我最远的:P

int number1 = Convert.ToInt32(Console.ReadLine());
int number2 = Convert.ToInt32(Console.ReadLine());

我认为我不能使用if语句的原因是因为它们尚未被涵盖。

这是一个相当合理的假设。

在条件语句之前覆盖条件表达式是一个有趣的教学选择,但它是完全有效的。

我需要使用?运算符吗?

是的。这是条件运算符,因此,如果要表达有条件运行的逻辑,请使用它。

如果它只询问它是否小于或大于、小于或等于或等于或大于数字 2,那会很容易,但现在有 3 种不同的东西。

是的。 这里的见解是条件运算符的形式是:

condition ? consequence : alternative

其中运算符生成一个值,其中三个操作数也是。 由于条件运算符生成一个值并获取一个值,因此您可以嵌套它们。例如:

condition ? 
(condition ? consequence : alternative) : 
alternative

condition ? 
consequence :
(condition ? consequence : alternative)

现在,结果可以去三个地方,而不是两个。

当然,您可以拥有任意数量的:

condition ? 
(condition ? consequence : alternative) : 
(condition ? consequence : alternative)

但是像这样的嵌套条件通常被认为是糟糕的样式,因为它们很难阅读。

这能让你深入了解如何解决问题吗?

这是我最远的:P

int number1 = Convert.ToInt32(Console.ReadLine());
int number2 = Convert.ToInt32(Console.ReadLine());

对于一个完整的初学者来说,这是合理的代码,但你很快就会知道我希望它是非常糟糕的风格,因为它很容易崩溃。 如果用户输入的内容不是数字,则程序将终止。

更好的方法是使用TryParse,并在用户输入错误输入时再次询问用户。 但是,由于您可能尚未了解循环,因此您还无法编写该代码。

您的下一行代码应该是:

string message = some conditional logic;
Console.WriteLine(message);

你能填写逻辑吗?

好吧,您的要求没有明确说明不使用if语句,所以我看不出为什么不使用它。但是,你比我更清楚,我会让你决定是否使用它。

或者,您可以使用三元运算来执行此操作,如下所示:

string result = number1 > number2 ? $"number {number1} is greater"
: number2 > number1 ? $"number {number2} is greater" 
: $"number {number1} and number {number2} are equal";
Console.WriteLine(result);

有三种不同的输出:大于、等于、小于。 因此,即使允许条件语句,它们也不是最佳选择。

int result = number1.CompareTo(number2);

如果结果<0,则您知道数字 1 小于数字 2。 如果结果为 0,则您知道数字 1 等于数字 2。 如果结果> 0,则您知道数字 1 大于数字 2。

文档

这个答案对于你想消除比较的情况,包括?:,可能不适合书中的"if语句之前"页面。

要删除代码中的所有可见条件,您通常使用映射(结果、操作)。在这种情况下,听起来Int32.CompareTo的结果是一个很好的起点,并且由于我们只有 3 个值 (-1,0,1),简单的数组(而不是Dictionary)就可以了。我们只需要将 [-1,1] 范围调整为 [0,2] 即可用于数组的索引:

int value1 = 42;
int value2 = 32;
string[] messages = new[] { 
"First less than second", // maps to -1
"Both are equal", // maps to 0
"First greater than second" // maps to 1
};
Console.WriteLine(messages[ 
1 + value1.CompareTo(value2) // shift -1,1 range to 0,2
]);

如果你不能使用ComapreTo但可以使用位操作,你也可以无条件地实现它(请参阅在没有任何比较的情况下比较两个整数和 http://graphics.stanford.edu/~seander/bithacks.html,下面的代码不太通用,因为我们知道System.Int32的大小(以位为单位):

int CompareToWithoutConditionals(int v1, int v2)
{
int v = v1 - v2;
return (v >> 31) - ((-v) >> 31);
}

最新更新