在switch语句中共享案例.表达问题.它是如何工作的
Sharing a case in a switch statement. Expression issues. How does it work?
在我正在处理的一个例子中,我有代码来挑选"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
。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?