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

时间:2013-02-08 02:18:50

标签: c++ switch-statement expression

在我正在研究的一个例子中,我有代码来挑选'a'到'z'之间的元音。它使用的是switch语句,而不是单独的情况,字符值共享相同的大小写。据我所知,到目前为止,涉及的表达方式即

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

计算结果为true或false,并转换为整数(1和0),在该整数(1和0)中,如果它为false,则它将落入“case 0:”(0显然为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.";
}

编辑:所有伟大答案的人。清理了很多。再次感谢您的意见

3 个答案:

答案 0 :(得分:2)

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

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

letter * (0)

letter * (1)

任何时候0都是0,这意味着如果没有相应的情况,控件将归结为默认情况(这一情况下降到case: 0部分)。否则,letter * (1)letter,因此会将其与其他案例进行比较,就好像它是switch (letter)一样。

答案 1 :(得分:1)

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

因此,如果括号中的条件评估为0,则整个表达式将产生false,如果评估为letter,则整个表达式将产生true,因为任何{{1}乘以零得到零,乘以1得到自己。

答案 2 :(得分:1)

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

让我们分两部分。

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

这个很容易。 letter的ascii代码是否大于a 的ascii代码是否小于z的代码。由于字母在ascii中按顺序增加,这意味着字母是一个小写字母。但是,此表达式的结果是true/false,在下一阶段转换为1/0。

(letter * <1/0>) 

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

由于带您到这里的原因完全相同(缺乏可读性),我会先将其分成if首先检查小写字母,然后再转到switch。< / p>