【问题标题】:Converting to lowercase at end of statement?在语句末尾转换为小写?
【发布时间】:2013-01-16 00:16:05
【问题描述】:

小问题。 (不使用 toupper() 和 tolower() 函数)我了解使用数值转换为大写和小写是什么,但是按照我的 C++ 书,为什么转换在此语句的末尾而不是之前?:

if (letter >= 'A')  //test for 'A' or larger
    if (letter <= 'Z')  //test for 'Z' or smaller
    {
        cout << endl
             << "You entered a capital letter."
             << endl;
        letter += 'a' - 'A'; //Convert to lowercase
        return 0;
    }

if (letter >= 'a') //test for 'a' or larger
{
    if (letter <= 'z') //test for 'z' or smaller
    {
    cout << endl
         << "You entered a small letter."
         << endl;

    return 0;
    }
}

既然第二个 if 语句处理小写输入,为什么在代码执行时它会将大写转换为小写?

【问题讨论】:

  • 在这个时代,这种转换应该被禁止。
  • @AndyProwl 为什么? 'a' - 'A' 是一个常数。给这封信分配一个常数是没有意义的。 += 使用此技术转换为小写。
  • 小心:char 可能已签名或未签名。 'a'-'A' 如果是无符号类型,可能会下溢。
  • @H2CO3 - += 转换为小写 if 系统使用 ASCII 编码字符 并且 代码只需要处理英文字符字母。只要您在混合中添加重音字符,或者,天堂禁止,西里尔文或希腊文,此代码就会失败。
  • @PeteBecker 你以为我不知道吗?我的目标是指出(假设为 ASCII)它应该是 += 而不是 =...

标签: c++ character uppercase lowercase


【解决方案1】:

因为第一部分中有一个return 0; 语句。如果原始字符是大写的,则控制流甚至不会到达第二个嵌套的if () { if () { } } 部分。

【讨论】:

  • 我明白这一点,但在那种情况下,事先检查和转换字母字符不是更好吗?对我来说,为什么要在 return 结束操作之前转换为小写字母是没有意义的。
  • @wilbomc: return 不会终止程序的执行,它只是让执行离开已调用的函数并将返回值传递给调用者。现在检查我的答案:)
  • 我认为 return 基本上将程序的控制权返回给操作系统,从而结束它。但我仍处于学习 C++ 的早期阶段。所以 return 基本上是返回小写值?
  • @wilbomc 再次阅读 C++ 教程 :) return 0; 只返回 0。不多也不少。
  • 我重新阅读了教程。我现在的印象是作者只是展示了一种转换为小写和大写的方法,但是以一种令人困惑的方式编写了它,我猜(可能是错误的),首先不需要小写转换,在至少在我写的例子中。在我看来,这种转换会更好地验证用户输入。但我只是一个初学者。
【解决方案2】:

为什么会在这个代码点将大写转换为小写 从第二个 if 语句处理小写输入开始执行?

那是因为

return 0

表示函数完成。线条

if (letter >= 'a') //test for 'a' or larger
{
    if (letter <= 'z') //test for 'z' or smaller
    {
    cout << endl
         << "You entered a small letter."
         << endl;

    return 0;
    }
}

如果字母最初是大写字母,则不会执行。它会打印出“您输入了一个大写字母。”,然后将其转换为小写,然后退出。

为什么转换是在这个语句的末尾而不是之前?

如果转换是在 cout 语句之前,那也没什么区别。

【讨论】:

    【解决方案3】:

    给定的 sn-p 可以是函数的主体:

    int convert(char& letter)
    {
        if (letter >= 'A' && letter <= 'Z')
        {
            letter += 'a' - 'A';
            return 0; // go out of this function...
        }
        else if (letter >= 'a' && letter <= 'z')
        {
            letter += 'A' - 'a';
            return 0; // go out of this function...
        }
        return -1; // it wasn't a letter as we expected
    }
    

    请注意,有一条可能的路径与这两种情况都不匹配。假设letter 是'?',因为您返回的是int 值,所以应该有迹象表明有问题(取决于您如何处理错误处理)。

    此函数的可能用法如下所示:

    char letter = '!';
    if (convert(letter) == 0)
        // success ...
    else
        // error ...
    

    如果问题真的是关于离开功能范围,那么这个问题也可能会有所帮助:
    How to break out of a function


    具体例子:

    void convertLetterAndPrintResult(char& letter)
    {
        if (convert(letter) == 0)
            std::cout << letter << std::endl;
        else
            std::cout << "ERROR: '" << letter << "' is not valid character!" << std::endl;
    }
    
    int main()
    {
        char letter = '!';
        convertLetterAndPrintResult(letter);
        letter = 'g';
        convertLetterAndPrintResult(letter);
        letter = 'L';
        convertLetterAndPrintResult(letter);
    }
    

    输出:

    ERROR: '!' is not valid character!
    G
    l
    

    【讨论】:

    • 谢谢。这个问题也很有帮助,当我进入打破功能的阶段时,我会回顾它。但是,简而言之,我的问题是,为什么在 return 语句之前将大写转换为小写。但我有点开始掌握它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多