在我正在研究的一个例子中,我有代码来挑选'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.";
}
编辑:所有伟大答案的人。清理了很多。再次感谢您的意见
答案 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>