由于某种原因,当我输入变量move
时,例如a1
或c2
,move[1]
被打印为1
,但在算术中使用时,实际上等于48 + move[1]
?我也不知道这个48
是从哪里来的,因为其余代码中的最高值是3。
std::string alphabet = "ABC";
std::vector<std::vector<int>> spaces{{1, 2, 3},{1, 2, 3},{1, 2, 3}};
std::vector<std::vector<int>> taken {{0, 0, 0},{0, 0, 0},{0, 0, 0}};
std::vector<char> symbols {'-','X','O'};
bool ValidateMove(std::string move, int player)
{
std::cout << move[1] << " " << move[1] + 0 << "\n\n";
int a;
switch(toupper(move[0]))
{
case 'A':
a = 0;
break;
case 'B':
a = 1;
break;
case 'C':
a = 2;
break;
}
for (int i = 0; i < spaces[a].size(); i++) // FOR SOME REASON MOVE[1] = 48 + i!!!
{
/* <debugging prints> */
std::cout << "\nspaces[a][i]:" << spaces[a][i] << " move[1]:" << move[1] << "\n"; // outputs as expected
if (spaces[a][i] > move[1]){
std::cout << "greater";
} // shouldn't work and doesn't
if (spaces[a][i] < move[1]){
std::cout << "less than";
std::cout << "\n -= " << move[1]- 0;
} //SHOULDN'T WORK BUT DOES -> move[1] - 0 is 48 + move[1] but when you just std::cout << move[1] you get what you should?
/* </debugging prints> */
if (spaces[a][i] == move[1])
{
if (player == 1)
{
taken[a][i] == 1;
}
else
{
taken[a][i] == 2;
}
for (int f = 0; f < taken.size(); f++)
{
for (int g = 0; g < taken[f].size(); g++)
{
std::cout << taken[f][g] << " ";
}
std::cout << "\n";
}
spaces[a].erase(spaces[i].begin() + i);
return true;
}
}
return false;
}
2条答案
按热度按时间wyyhbhjk1#
C是一种语言,最初是C的扩展,并逐渐增加了更高级别的功能。虽然有一些例外,但大多数在C中工作的东西在C中的工作方式相同。结果是,即使你试图写“现代高级C++”,从C继承的低级特性有时也会露出丑陋的头。
在低层次上,计算机必须用数字来表示一切。字符存储为数字代码。在几乎所有的计算机上,你今天遇到的数字0到127代表ASCII* 的字符。
有些语言对字符和代表该字符的代码进行了严格的区分。C和C++都没有。
当你用cout打印一个char时,它被当作一个字符,但是当你在算术中使用它时,它被当作一个数字。48是字符'0'的ASCII码,49是'1'的ASCII码,依此类推。
1cklez4t2#
0的字符值在ascii中是48,您试图将数字添加到字符值。将std:string更改或强制转换为适当的类型,如int,它将工作