2012-10-29 56 views
1

为什么我不能和初始化字符串“\ X”为什么我不能初始化字符串“ 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; 
    } 

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

+0

你到底想达到什么目的?您的目标是打印出从A到F的等级字母吗? –

+0

我正在尝试根据输入的年级获取成绩信。 – vladinkoc

回答

4

因为语法禁止它。字符串文字中的\x序列是一个前缀,意思是“这里是一个字符的十六进制代码”,但您试图省略代码部分。这意味着解析字面值并找出要放入字符串的字符是不可能的。

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

2

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

"\x48" 

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

你也误会static_cast<...>:如果x一个std::string,静态浇铸成字符串会导致错误;如果它是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; 
+0

@SteveJessop你说得对,我完全忘记了这个构造函数的重载。我简单地想过使用'string(&gradeLetter,1)',但对我来说听起来太过分了:)谢谢! – dasblinkenlight

相关问题