2
#include <iostream>
#include <vector>
#include <cctype>

using namespace std;

char get_selection() {
    char selection{};
    cin >> selection;
    return toupper(selection);
}

int main() {
    char selection {};
    do{
        selection = get_selection();
        switch(selection){
           ...
        }
    } while(selection!='Q');

    cout<<endl;
    return 0;
}

我想知道为什么我会收到此检查/警告/提示

Clang-Tidy:从“int”缩小到有符号类型“char”的转换是实现定义的

我在那里做的唯一一件事就是获取字符并“大写”它,以防它还没有,所以我不必在我的开关上处理 2 个案例。有谁知道我必须改变什么才能摆脱这个,所以我会把它完全绿色化,因为这是唯一的问题?看来我缺乏一些关于转换的知识。

谢谢!

打印屏幕

4

2 回答 2

1

在这个函数中

char get_selection() {
    char selection{};
    cin >> selection;
    return toupper(selection);
}

编译器从 int 类型(C 函数 toupper 的返回类型)隐式转换为 char 类型。

为了避免警告进行显式转换,例如

char get_selection() {
    char selection{};
    cin >> selection;
    return char( ::toupper( ( unsigned char )selection) );
}
于 2020-03-29T10:45:35.640 回答
1

另一个不依赖于实现定义行为的解决方案是:

return toupper(selection, std::locale());

此版本toupper返回与输入相同的类型。

于 2020-03-29T11:09:19.143 回答