在switch语句中共享案例.表达问题.它是如何工作的

Sharing a case in a switch statement. Expression issues. How does it work?

本文关键字:何工作 工作 问题 语句 switch 共享 案例      更新时间:2023-10-16

在我正在处理的一个例子中,我有代码来挑选"a"到"z"之间的元音。它使用了一个switch语句,即字符值共享相同的大小写,而不是单独的大小写。据我所知,所涉及的表达即

***(letter * (letter >= 'a' && letter <= 'z'))*** 

计算结果为true或false,并转换为一个整数(1和0),在该整数中,它进入"case 0:"(0显然为false),以在结果为false时处理该结果。有人能解释一下这个语句所涉及的表达式到转换的过程吗?特别是逻辑表达式乘法背后的推理。这是我的示例代码:

char letter(0); 
cout << endl
     << "Enter a small letter: ";
 cin >> letter;
switch(letter * (letter >= 'a' && letter <= 'z'))
{
case 'a': case 'e': case 'i': case 'o': case 'u':
    cout << endl << "You entered a vowel.";
    break;
case 0:
        cout << endl << "That is not a small letter.";
        break;
    default: cout << endl << "You entered a consonant.";
}

编辑:所有的答案都很棒。清理了很多。再次感谢您的输入

letter * (letter >= 'a' && letter <= 'z')

条件表达式被乘数的计算结果为true或false。letter的ASCII值将与字符"a"answers"z"进行比较。True和false可以分别隐式转换为数字1和0(并且letter将转换为其数字ASCII值)。所以它要么是:

letter * (0)

letter * (1)

任何时间0都是0,这意味着如果没有相应的情况,控件将转到默认情况(这一部分转到case: 0部分)。否则,letter * (1)letter,因此它将被其他情况比较,就像它是switch (letter)一样。

(letter >= 'a' && letter <= 'z')是一个布尔表达式,如果字母在'a''z'之间,则计算结果为true;现在,当你把它乘以letter时,它首先被提升为char,如果它是true,假设值为1,如果是false,则为0。

因此,如果括号中的条件求值为false,则整个表达式将产生0,如果求值为true,则整个公式将产生letter,因为任何letter乘以零都产生零,而乘以1则产生自身。

(letter * (letter >= 'a' && letter <= 'z'))

让我们把它分成两部分。

(letter >= 'a' && letter <= 'z')

这个很简单。letter的ascii码是否大于a的ascii码是否小于z的ascii码。由于字母在ascii中按顺序递增,这意味着该字母是一个小字母。然而,这个表达式的结果是true/false,在下一阶段转换为1/0。

(letter * <1/0>) 

在此阶段,letter * 1返回字母,letter * 0返回0。这解释了案例陈述的工作原理。

出于与您来到这里完全相同的原因(缺乏可读性),我将首先将其拆分为if,检查小写字母,然后再传递给switch