1

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

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

评估为真或假并转换为整数(1和0),其中它落入“案例0:”(0显然为假)以处理结果是否为假。任何人都可以解释该语句涉及的转换过程的表达式吗?特别是逻辑表达式乘法背后的推理。这是我的示例代码:

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.";
}

编辑:所有伟大的答案家伙。清理了很多。再次感谢您的输入

4

3 回答 3

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

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

letter * (0)

或者

letter * (1)

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

于 2013-02-08T02:21:51.937 回答
1

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

0因此,如果括号中的条件计算结果为false,或者letter如果它计算结果为,则整个表达式将产生true,因为任何letter乘以零的结果为零,而乘以 1 的结果为自身。

于 2013-02-08T02:23:45.683 回答
1
(letter * (letter >= 'a' && letter <= 'z'))

让我们分成两部分。

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

这很容易。是letter大于a 小于的ascii码z。由于字母在 ascii 中是依次增加的,这意味着该字母是一个小写字母。然而,这个表达式的结果是 a true/false,它在下一阶段转换为 1/0。

(letter * <1/0>) 

在这个阶段,letter * 1return letter 和letter * 0return 0。这解释了案例陈述是如何工作的。

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

于 2013-02-08T02:24:32.713 回答