如何修复隐式转换警告? 我在阅读C++如何编写第九版,试图学习C++,并在第7章中尝试与骑士的问题进行练习。
基于输出中的“64”,代码显然存在某种逻辑错误(我将自己修复),但在此之前,我一直在理解编译器警告,以及如何处理这些警告 我已将board声明为无符号int的二维数组,因为它只能包含值0-7。同样,出于同样的原因,我将for循环中的变量声明为unsigned int 我在stackoverflow上读到了关于这一点的回复,但它们很快就超过了我的理解如何修复隐式转换警告? 我在阅读C++如何编写第九版,试图学习C++,并在第7章中尝试与骑士的问题进行练习。,c++,c++11,implicit-conversion,unsigned,signed,C++,C++11,Implicit Conversion,Unsigned,Signed,基于输出中的“64”,代码显然存在某种逻辑错误(我将自己修复),但在此之前,我一直在理解编译器警告,以及如何处理这些警告 我已将board声明为无符号int的二维数组,因为它只能包含值0-7。同样,出于同样的原因,我将for循环中的变量声明为unsigned int 我在stackoverflow上读到了关于这一点的回复,但它们很快就超过了我的理解 #include <iostream> #include <array> #include <iomanip>
#include <iostream>
#include <array>
#include <iomanip>
using namespace std;
void printArray(const array< array< unsigned int, 8 >, 8 >);
int main() {
array< array< unsigned int, 8 >, 8 > board = {};
array< int, 8 > horizontal = {{ 2, 1, -1, -2, -2, -1, 1, 2 }};
array< int, 8 > vertical = {{ -1, -2, -2, -1, 1, 2, 2, 1 }};
unsigned int currentRow = 0;
unsigned int currentCol = 0;
for (unsigned int i = 0; i < 64; i++) {
board[currentRow][currentCol] = i + 1;
for (unsigned int j = 0; j < 8; j++) {
if (currentRow + horizontal[j] >= 0 &&
currentRow + horizontal[j] < 8 &&
currentCol + vertical[j] >= 0 &&
currentCol + vertical[j] < 8 &&
board[currentRow + horizontal[j]][currentCol + vertical[j]] == 0
) {
currentRow = currentRow + horizontal[j];
currentCol = currentCol + vertical[j];
break;
}
}
}
printArray(board);
}
void printArray(const array< array< unsigned int, 8 >, 8 > myBoard) {
for ( unsigned int i = 0; i < 8; i++) {
for ( unsigned int j = 0; j < 8; j++) {
cout << '[' << setw(2) << setfill('0') << myBoard[i][j] << "] ";
}
cout << endl;
}
}
#包括
#包括
#包括
使用名称空间std;
void printary(常量数组<数组<无符号整数,8>,8>);
int main(){
数组,8>board={};
数组水平={{2,1,-1,-2,-2,-1,1,2};
数组垂直={{-1,-2,-2,-1,1,2,2,1};
无符号int currentRow=0;
无符号整数currentCol=0;
for(无符号整数i=0;i<64;i++){
线路板[currentRow][currentCol]=i+1;
for(无符号整数j=0;j<8;j++){
如果(当前行+水平[j]>=0&&
当前行+水平[j]<8&&
currentCol+垂直[j]>=0&&
电流col+垂直[j]<8&&
线路板[currentRow+水平[j]][currentCol+垂直[j]]==0
) {
当前行=当前行+水平[j];
currentCol=currentCol+垂直[j];
打破
}
}
}
打印阵列(板);
}
无效打印数组(常量数组<数组<无符号整数,8>,8>myBoard){
for(无符号整数i=0;i<8;i++){
for(无符号整数j=0;j<8;j++){
cout=0始终为真[-Wtautological compare]
currentCol+垂直[j]>=0&&
~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~
src/main.cpp:21:22:警告:隐式转换将符号性更改为:“value_type”(也称为“int”)到“unsigned int”[-Wsign conversion]
电流col+垂直[j]<8&&
~ ^~~~~~~~~~~
src/main.cpp:22:28:警告:隐式转换将有符号性更改:“value_type”(又名“int”)为“unsigned int”[-Wsign conversion]
线路板[currentRow+水平[j]][currentCol+垂直[j]]==0
~ ^~~~~~~~~~~~~
src/main.cpp:22:56:警告:隐式转换将有符号性更改:“value_type”(又名“int”)为“unsigned int”[-Wsign conversion]
线路板[currentRow+水平[j]][currentCol+垂直[j]]==0
~ ^~~~~~~~~~~
src/main.cpp:24:35:警告:隐式转换将有符号性更改:“value_type”(又名“int”)为“unsigned int”[-Wsign conversion]
当前行=当前行+水平[j];
~ ^~~~~~~~~~~~~
src/main.cpp:25:35:警告:隐式转换将有符号性更改:“value_type”(又名“int”)为“unsigned int”[-Wsign conversion]
currentCol=currentCol+垂直[j];
~ ^~~~~~~~~~~
生成了10个警告。
/建造/主要
[01] [24] [09] [00] [00] [26] [37] [00]
[10] [41] [02] [25] [36] [00] [00] [27]
[23] [08] [11] [40] [21] [38] [00] [00]
[64] [03] [22] [35] [00] [00] [28] [00]
[07] [12] [05] [20] [39] [34] [00] [00]
[04] [17] [14] [31] [00] [29] [00] [00]
[13] [06] [19] [16] [33] [00] [00] [00]
[18] [15] [32] [00] [30] [00] [00] [00]
编译器在您编写
currentRow + horizontal[j] >= 0
您正在将一个有符号整数
与一个无符号整数
相加,因此有符号整数
被转换为无符号整数
,因此求和的结果是一个无符号整数
。一个无符号整数
总是大于或等于零
所以这个测试总是真的
,这大概不是你想要的
同样的问题
currentCol + vertical[j] >= 0
更一般地说,对于有符号/无符号
值的每一个总和
一个选项是将currentRow
和currentCol
定义为(signed
)int
否则,在将无符号
值添加到有符号
值时,可以适当地强制转换这些值
int{currentRow} + horizontal[j] >= 0
编译器告诉你当你写的时候
currentRow + horizontal[j] >= 0
您正在将一个有符号整数
与一个无符号整数
相加,因此有符号整数
被转换为无符号整数
,因此求和的结果是一个无符号整数
。一个无符号整数
总是大于或等于零
所以这个测试总是真的
,这大概不是你想要的
同样的问题
currentCol + vertical[j] >= 0
更一般地说,对于有符号/无符号
值的每一个总和
一个选项是将currentRow
和currentCol
定义为(signed
)int
否则,在将无符号
值添加到有符号
值时,可以适当地强制转换这些值
int{currentRow} + horizontal[j] >= 0
你知道,这是我还没有尝试过的一件事。我会尝试一下。我知道我在这里遗漏了一些东西,但对于永远不会包含负值的变量来说,这样做似乎是违反直觉的。将currentRow和currentCol更改为int会将警告减少到4,所有这些警告都是:隐式转换会改变符号:“int”到“size\u type”@TimothyB.-对我来说似乎也违反直觉,但一般来说,尽量避免在不同类型的对象之间进行操作,而且还要避免有符号性;混合
有符号的和无符号的值通常会引起很大的麻烦。或者,您可以使用静态类型转换(currentRow)+水平[j]>=0,但正如@max66所说的,在处理不同类型的变量时要小心。你知道,这是我还没有尝试过的一件事。我会尝试一下。我知道我在这里遗漏了一些东西,但对于永远不会包含负值的变量,这样做似乎违反直觉。将currentRow和currentCol更改为int-reduced th