1

为什么我不能用“\x”初始化字符串

string s = "\x"

如果我以后可以写的话会很有用:

int grade = 0;
while (cin >> grade)
    if (grade < 60)
        cout << "Your grade letter is F!";
    else {
        x = 50 - grade/10;
        s = s + static_cast<string>(x);
        cout << "Your grade letter is " << s << endl; 
    }

我更喜欢答案,它使用转义序列计算来设置等级字母。

4

2 回答 2

4

因为语法禁止它。字符串文字中的\x序列是一个前缀,意思是“这是一个字符的十六进制代码”,但您试图省略代码部分。这意味着无法解析文字并确定将哪个字符放入字符串中。

请注意,这是编译时的事情,它必须能够通过查看文字本身来计算由字符串文字表示的字符序列。

于 2012-10-29T12:03:49.523 回答
2

您误解了转义序列的处理方式。它们是在编译时计算的,而不是在运行时计算的。换句话说,当你写

"\x48"

它在运行时不会变成四个字符的字符串;编译器在程序运行之前将其转换为单字符串。

您也误解了static_cast<...>:如果x不是a ,std::string其静态转换为字符串会导致错误;如果它是 a std::string,则静态转换将无效。

您可以在运行时创建一个单字符串,并将一个字符代码放入其唯一的字符中,如下所示:

int grade = 83; // <<<=== 1..100
grade--;
int gradeLetter = g < 60 ? 'F' : ('A' + (100-grade)/10);
// At this point you can do the output:
cout << "Your grade is " << gradeLetter << endl;
// If you must have a string, do this:
string gradeStr(1,gradeLetter);
cout << "Your grade is " << gradeStr << endl;
于 2012-10-29T12:04:16.907 回答