Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否可以使用I++;语法?_C++_C - Fatal编程技术网

C++ 我是否可以使用I++;语法?

C++ 我是否可以使用I++;语法?,c++,c,C++,C,内部fkt(内部和内部) { 返回i++; } 打印“567”。假设我想这样打印“5 7 9”,在fkt()中没有临时变量的情况下,是否可以以类似的方式打印?(一个临时变量会略微降低效率,对吗?) return i+=2 或 这两者都先增加了我,然后又返回它,这不是我所需要的 谢谢 编辑:主要原因是,我在函数中而不是在函数外部执行此操作,因为fkt将是函数指针。原始函数将对i执行其他操作。我只是觉得使用{int temp=I;I+=2;return temp;}似乎没有{return I++

内部fkt(内部和内部) { 返回i++; }

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

return i+=2 

这两者都先增加了我,然后又返回它,这不是我所需要的

谢谢

编辑:主要原因是,我在函数中而不是在函数外部执行此操作,因为fkt将是函数指针。原始函数将对i执行其他操作。我只是觉得使用{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,它是如此简单。。。以后我会尽量提供更多的背景资料

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

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

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

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


如果希望fkt能够向i添加不同的量,则需要传递一个参数。没有实质性的理由选择
++
而不是
++=

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

return (i += 2) - 2
printf("%d ", i);
i+=2;
不过,仅回答这个问题,我认为您不应该害怕使用临时变量。

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

您可以尝试:

int fkt(int &i)
{
  ++ii;
  return i++;
}
您可以将其与以下内容进行比较:

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

也就是说,我认为您不应该过早地考虑任何此类性能问题。

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

int t = i;
i+=2;
return t;
然后,编译器可以优化它,同时将函数内联到如下内容中:

return (i += 2) - 2
printf("%d ", i);
i+=2;
这是最好的

编辑:现在你说你通过函数指针跳转到此函数?与使用临时变量相比,通过指针调用函数的速度非常慢。我不确定,但我想我记得Intel文档中说,在Core 2s和i7s上大约有20-30个cpu周期,也就是说,如果你的函数代码都在缓存中。由于编译器在被指针调用时无法内联函数,因此++也将创建一个临时变量

一个临时变量可能会稍微 降低效率,对吗

始终考虑“过早优化是万恶之源”。花时间在其他部件上,然后尝试优化此部件和++可能会产生同样的结果。您的电脑将管理;)

好吧,你可以

return i+=2, i-2;
也就是说,只要遵循这条简单的格言:

编写易于理解的代码

人类容易理解的代码通常容易被编译器理解,因此编译器可以对其进行优化

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

我推荐

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

我想你真正想要的是一个函子:

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()); 
} 
那怎么办

int a = 0;
++++a;
不带临时变量的增量+2

编辑:
哦,对不起:没有注意到你想要达到5,7,9。这需要临时变量,所以不能使用前缀符号。

忽略这些效率考虑因素,使用一个有效的解决方案。我只想确保您意识到printf比I+=2慢数千倍。SadSido是对的……I+=2;返回i;也一样。如果你仔细想想,i++实际上只是一种表示i+=1的便捷方式,这是一种表示i=i+1的便捷方式。(有趣的是,我们程序员想出了方便的方法,使我们的方便方法更加方便)你不会有任何开销,因为汇编指令已经有了一个“addimmediate”选项,可以用整数进行加法。不需要额外的寄存器!首先编写最容易阅读和维护的代码,然后进行度量。如果您通过测量发现性能问题,请首先找到对性能影响最大的领域,然后实施您认为是改进的地方,然后再次测量,以查看您的猜测是否正确。“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。然而,我们不应该在这关键的3%中放弃我们的机会。一个好的程序员不会因为这样的推理而自满,他会明智地仔细查看关键代码;但只有在代码完成后,我才会这样做。”确定的”-Donald Kunth——在PDP-11上,编译器优化是由人类执行的;)好吧,我很好奇-PDP-11有什么魔力意味着I++比I+=1快?某种类似于6502上INX/INY的片上递增指令,编译器知道并优先使用标准ALU加法?PDP11的体系结构(以及此后出现的许多)可以在一条指令中取消引用并递增或递减指针。通常,递增/递减被强制为加载/存储的数据大小(例如,如果加载,则为1)