我想知道为什么将v.size()
传递给宏参数会给我一个错误但是如果我将值存储在临时变量中并传递它而不是它有效;
这是我的代码:
#include <stdio.h>
#include <vector>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define REP(i,n) FOR(i,0,n-1)
int main(){
int n,x;
vector<int> v;
scanf("%d", &n);
REP(i, n){
scanf("%d", &x);
printf("Size of Vector = %d\n", v.size());
int exists = 0;
REP(j, v.size()){
// Loop executes even when size = 0
if (v[j] == x){
exists = 1;
break;
}
}
if (!exists)
v.push_back(x);
}
return 0;
}
然而这有效:
int size = v.size();
REP(j, size){
if (v[j] == x){
exists = 1;
break;
}
}
答案 0 :(得分:3)
问题是你的FOR宏正在做b - 1.所以如果b是0,那么无符号(我认为是v.size())你会得到一个非常大的数而不是-1。您应该使用以下宏:
#define FOR(i,a,b) for(int i=a;i<b;++i)
#define REP(i,n) FOR(i,0,n)
答案 1 :(得分:1)
您的代码
REP(j, v.size()){
将被解释为
for(int j=0;j<=v.size()-1;++j) {
vector :: size()返回无符号整数值。如果大小为零,则v.size()-1
生成最大整数值,即j<=v.size()-1
始终为真。
答案 2 :(得分:0)
v.size()
的类型未签名。如果您延长第REP(j, v.size()){
行,您将获得for(int j=0;j<=v.size()-1;++j)
。如果v
为空,则v.size()-1
的结果是v.size()
类型的无符号变量可以容纳的最大值。在j<=v.size()-1
中,变量j
被提升为无符号类型。这导致j
没有边界,很容易理解为什么会出现vector subscript out of range
错误。