我可以使用i ++语法将int i增加多个吗?

时间:2010-07-14 14:05:14

标签: c++ c

int fkt(int& i)     {       返回i ++;     }

int main()
{
  int i = 5;
  printf("%d ", fkt(i));
  printf("%d ", fkt(i));
  printf("%d ", fkt(i));
}

打印'5 6 7'。假设我想像这样打印'5 7 9',是否有可能以类似的方式在fkt()中没有临时变量? (一个临时变量会略微降低效率,对吗?)即,像

return i+=2 

return i, i+=2; 

首先增加i然后返回它,这不是我需要的。

由于

编辑:主要原因,我在函数中而不是在外部执行它是因为fkt将是函数指针。原来的功能会对我做一些其他的事情。我只觉得使用{int temp = i; I + = 2; return temp;}看起来不像{return i ++;}。

我不关心printf,这只是为了说明结果的使用。

EDIT2:哇,这似乎是一个比传统板更多的聊天:)谢谢你的所有答案。我的fkt实际上就是这个。根据某些条件,我将get_it定义为get_it_1,get_it_2或get_it_4:

unsigned int (*get_it)(char*&);

unsigned int get_it_1(char* &s)
  {return *((unsigned char*) s++);}
unsigned int get_it_2(char* &s)
  {unsigned int tmp = *((unsigned short int*) s); s += 2; return tmp;}
unsigned int get_it_4(char* &s)
  {unsigned int tmp = *((unsigned int*) s); s += 4; return tmp;}

对于get_it_1,它非常简单......我将在未来尝试提供更多背景......

9 个答案:

答案 0 :(得分:28)

  

“临时变量会略微降低效率,对吧?”

错误。

你测量过吗?请注意,++仅对PDP-11具有神奇的效率。在大多数其他处理器上,它与+=1相同。请测量两者,看看实际的差异是什么。

答案 1 :(得分:18)

  

(临时变量会略微降低效率,对吗?)

如果这是你问的主要原因,那么你太早就要担心了。在遇到实际性能问题之前,不要再猜测编译器。

如果你想让fkt能够为i添加不同的金额,那么你需要传递一个参数。没有任何理由可以选择++而不是+=

答案 2 :(得分:9)

你可以增加两次,然后减去,例如:

return (i += 2) - 2

回答这个问题,我认为你不应该害怕使用临时变量。

答案 3 :(得分:4)

如果您确实需要该速度,请检查编译器输出的汇编代码。如果你这样做:

int t = i;
i+=2;
return t;

然后编译器可以优化它,同时将函数内联到:

printf("%d ", i);
i+=2;

这是最好的。

编辑:现在你说你是通过函数指针跳转到这个函数的吗?与使用临时变量相比,通过指针调用函数非常慢。我不确定,但我想我记得英特尔文档说它在核心2和i7上大约有20到30个cpu周期,也就是说你的功能代码都在缓存中。由于编译器在指针调用时无法内联函数,因此++也会创建一个临时变量。

答案 4 :(得分:3)

  

临时变量略有增加   降低效率,对吧?

始终考虑到“过早优化是万恶之源”。花时间在其他部分,然后尝试优化它。 + =和++可能会导致同样的事情。您的电脑将管理;)

答案 5 :(得分:3)

嗯,你可以做到

return i+=2, i-2;

那就是说,只要遵循这个简单的格言:

  

编写易于理解的代码。

人们易于理解的代码通常很容易让编译器理解,因此编译器可以对其进行优化。

为了优化代码而编写疯狂的东西通常只会让编译器感到困惑,并使编译器更难以优化代码。

我会推荐

int fkt(int &i)
{
    int orig = i;
    i += 2;
    return orig;
}

答案 6 :(得分:2)

“临时变量”不太可能降低性能,因为i ++必须在内部保持旧状态(即它隐式使用你所谓的temprorary变量)。但是,增加2所需的指令可能比用于++的指令要慢。

您可以尝试:

int fkt(int &i)
{
  ++ii;
  return i++;
}

您可以将其与以下内容进行比较:

int fkt(int &i)
{
  int t = i;
  i += 2;
  return t;
}

那就是说,我认为你不应该过早地做任何这样的性能考虑。

答案 7 :(得分:1)

我认为你真正想要的是一个仿函数:

class Fkt
{
   int num;
public:
   Fkt(int i) :num(i-2) {}
   operator()() { num+=2; return num; }
}

int main() 
{ 
  Fkt fkt(5); 
  printf("%d ", fkt()); 
  printf("%d ", fkt()); 
  printf("%d ", fkt()); 
} 

答案 8 :(得分:-1)

怎么样?
int a = 0;
++++a;

增加+2没有临时变量。

编辑: 哎呀,对不起:没注意到你要达到5,7,9。这需要临时变量,因此不能使用前缀表示法。