如何修复隐式转换警告? 我在阅读C++如何编写第九版,试图学习C++,并在第7章中尝试与骑士的问题进行练习。

如何修复隐式转换警告? 我在阅读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>

基于输出中的“64”,代码显然存在某种逻辑错误(我将自己修复),但在此之前,我一直在理解编译器警告,以及如何处理这些警告

我已将board声明为无符号int的二维数组,因为它只能包含值0-7。同样,出于同样的原因,我将for循环中的变量声明为unsigned int

我在stackoverflow上读到了关于这一点的回复,但它们很快就超过了我的理解

#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