编译失败: 30:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::__cxx11::basic_string<char> >::size_type' {aka 'long long unsigned int'} [-Wsign-compare] for(int i = 0; i < ve.size(); ++i) ~~^~~~~~~~~~~
时间: 2023-10-20 17:07:16 浏览: 177
这个编译警告是因为在for循环中,使用了int类型的变量i来遍历vector,而vector的size()函数返回的类型是unsigned long long int,两者类型不同导致了警告。
为了解决这个问题,可以将for循环中的i的类型改为unsigned long long int,或者使用auto关键字来自动推导类型。例如:
```c++
for (unsigned long long int i = 0; i < ve.size(); ++i)
```
或者
```c++
for (auto i = 0; i < ve.size(); ++i)
```
这样就可以消除编译警告了。
相关问题
[Warning] comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'unsigned int'} [-Wsign-compare]
这个警告是由于你在比较不同类型的整数表达式时,其中一个是有符号的(int),另一个是无符号的(std::__cxx11::basic_string<char>::size_type)。在这种情况下,编译器会发出警告,因为比较可能产生意外的结果。
要解决这个警告,你可以将其中一个整数转换为与另一个类型相同的类型。例如,如果你知道字符串的大小不会超过int的范围,你可以将无符号整数转换为有符号整数,或者将有符号整数转换为无符号整数,以匹配类型。这样做可以消除警告,但仍需谨慎对待可能的溢出情况。
下面是一个示例,将无符号整数转换为有符号整数:
```cpp
int size = static_cast<int>(str.size());
```
或者将有符号整数转换为无符号整数:
```cpp
std::string::size_type size = static_cast<std::string::size_type>(length);
```
在进行类型转换时,请确保你理解数据的范围和可能的溢出情况,以避免潜在的错误。
Accepted 2.05215ms 404KiB foo.cc: In function 'std::string infixToPostfix(std::string)': foo.cc:19:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 19 | for (int i = 0; i < expression.length(); i++) { | ~~^~~~~~~~~~~~~~~~~~~~~
感谢您提供的提示。警告是由于在 `for` 循环中,将 `int` 类型的 `i` 与 `expression.length()` 的返回类型 `std::__cxx11::basic_string<char>::size_type` 进行比较,两者类型不同导致的。
为了解决这个警告,您可以将 `i` 的类型更改为与 `expression.length()` 返回类型相同的类型,即 `std::__cxx11::basic_string<char>::size_type`。修改后的代码如下:
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int precedence(char op) {
if (op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
string infixToPostfix(string expression) {
string postfix = "";
stack<char> stk;
stk.push('#');
for (std::__cxx11::basic_string<char>::size_type i = 0; i < expression.length(); i++) {
char c = expression[i];
if (isalnum(c)) {
postfix += c;
} else if (c == '(') {
stk.push('(');
} else if (c == ')') {
while (stk.top() != '#' && stk.top() != '(') {
postfix += stk.top();
stk.pop();
}
stk.pop();
} else {
while (stk.top() != '#' && precedence(c) <= precedence(stk.top())) {
postfix += stk.top();
stk.pop();
}
stk.push(c);
}
}
while (stk.top() != '#') {
postfix += stk.top();
stk.pop();
}
return postfix;
}
int main() {
string expression;
cin >> expression;
string postfix = infixToPostfix(expression);
cout << postfix << endl;
return 0;
}
```
通过将 `i` 的类型更改为 `std::__cxx11::basic_string<char>::size_type`,可以消除警告。
请再次运行代码,看看警告是否消失。如果您还有其他问题,请随时提问。