一个简单问题,认真请教

lop5712 2003-09-26 03:54:11
一位C++绝对级大师(老外)写的:
ret = ( temp = ( a > b ? a : b ) ), temp;
其中的ret,temp,a,b没有说明类型,可认为是模板参数。注意,temp一定要有(这条代码的后面的代码会用到)

我想知道为什么不写成
ret = ( temp = ( a > b ? a : b ) );
我以为这两个没有任何区别,不过很明显地前者决不是什么由于习惯而写成的,一定有什么原因。

如果是优化的原因,希望能指明一些是怎么优化的。希望各位多多指点
...全文
129 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lop5712 2003-09-27
  • 打赏
  • 举报
回复
我又想了一下,认为这只是编编译器时出现的小现象(也不算做一个问题),可能如下:
展开inline函数时,查看其有没有返回值,如果有返回值,在展开时尽量使函数中的语句能在一条语句中表述完成,这样有助于开启编译器优化(指给编译器造成足够的条件使得其认为这里可以施行优化)。就好象应尽量使用?:而不要换成if else,前者有可能是编译器对其优化。
所以编编译器时,编成用逗号来将多句话变成一句,其中总是将return后面接的语句用逗号添加到扩展成的语句中去,如下:
inline int Test( int a, int b )
{
int temp1 = a + b;
int temp2 = a - b;
return temp1 > temp2 ? temp1 : temp2;
}
则ret = Test( val1, val2 );将会扩展成
ret =( ( temp1 = val1 + val2 ),
 ( temp2 = val1 - val2 ),
 ( temp1 > temp2 ? temp1 : temp2 ) );
即作者本意并不想生成我开始写出来的那种写法,只是按照他的编译器的算法,将其展开后就是那个样子,而其对效率没有影响,所以作者并没有多写语句来除掉这个小现象。
因此出现前面提到的写法。也就是说,一个正常写法是完全不应该加那个逗号及其以后的东西的。

这只是我的想法,希望能有不同意见出现
lop5712 2003-09-27
  • 打赏
  • 举报
回复
即使没有逗号,也是先执行temp = ( a > b ? a : b );而不需要temp;,也不会产生警告
何况是先执行temp = ( a > b ? a : b )再执行temp,作者的意思因该就是如下的简写,但除了多余,还能有什么好处呢?
temp = ( a > b ? a : b );
ret = temp;
Wolf0403 2003-09-27
  • 打赏
  • 举报
回复
好像听说如果变量在赋值前没有被使用过会出警告,所以用这个来消除警告。。。
猜测而已,呵呵。
xiao78xy 2003-09-27
  • 打赏
  • 举报
回复
猜测:
程序应该是从右—>左运行的,在运行( temp = ( a > b ? a : b ) )时,可能要对temp的一个确认,或是一个强调(因为temp是用来存放a or b),

只是猜测, 我也挺好奇的!
lop5712 2003-09-27
  • 打赏
  • 举报
回复
我也知道用逗号没错,可是没必要啊。难道这样写很好玩?
i = ( ( j = ( ( k = 3 ), k ) ), j );
liao2001 2003-09-27
  • 打赏
  • 举报
回复
我觉得这仅仅是伪代码的形式吧
根据逗号运算的规则,这样进行伪码替换很合理呀
lop5712 2003-09-27
  • 打赏
  • 举报
回复
真是对不起各位,我现在从实招来,在《深入探索C++对象模型》(侯捷译)中
其中他讲到inline函数的实现方法中,举例:
inline int max( int a, int b )
{
return a > b ? a : b;
}
调用处的
int c = max( val1, val2 );
直接扩展成
int c = __max_a > __max_b ? __max_a : __max_b;

但是如果这样写
inline int max( int a, int b )
{
int temp = a > b ? a : b;
return temp;
}
则扩展成(由编译器扩展)
int c = ( __max_temp = ( __max_a > __max_b ? __max_a : __max_b ) ), __max_temp;

之所以这样扩展(不将__max_temp去掉)是因为编译器的NRV优化未打开。要是打开白痴都知道将__max_temp去掉,可是在未打开(NRV)的情况下,编译器这样写摆明了是一种考虑各种可能的类型估值(即__max_a、__max_b等可能不是int类型),当时我就是不明白,编编译器的那位老大(也就是作者)是出于什么样的考虑要让编译器这样扩展?书中未说,可能认为这是一种常识
xueweizhong 2003-09-26
  • 打赏
  • 举报
回复
一位C++绝对级大师(老外)写的:
???
到底哪位大师在哪篇文章中写的???

搞得神神秘秘

把那篇文章贴出来不就知道谁是谁非了?
snipersu 2003-09-26
  • 打赏
  • 举报
回复
也许还和编译器有关的.
snipersu 2003-09-26
  • 打赏
  • 举报
回复
"后面的代码没用,实际也没有,只是说明一点,temp必须存在,可以如下
template< typename RET, typename TEMP, typename TYPE1, typename TYPE2 >
RET max( TYPE1 a, TYPE2 b, TEMP &temp )
{
RET ret;
// 中间代码
ret = ( temp = ( a > b ? a : b ) ), temp;
return ret;
}"
应该没啥区别吧!
我写了两个简单的模板函数,反编译后的代码没啥不同!
可能像" sdtea(抗日统一联盟:衣田) "说的是为了起一个桥梁的作用.
但是,是实现由type1,type2 -> temp,再由temp转化成ret的转化吧!.
jet9600 2003-09-26
  • 打赏
  • 举报
回复
能不能将这一段的上下文再多提供点?
如果光就这一条语句来说,确实分不出有什么区别。
leyt 2003-09-26
  • 打赏
  • 举报
回复
学习
pongba 2003-09-26
  • 打赏
  • 举报
回复
ret = ( temp = ( a > b ? a : b ) );从任何意义上讲都是说的过去的!!!
sdtea 2003-09-26
  • 打赏
  • 举报
回复
据估计原来temp是为了在TYPE1,TYPE2这两种类型间架起桥梁, 传入的参数的实际值是毫无意义的,原代码中肯定用了默认值!
lop5712 2003-09-26
  • 打赏
  • 举报
回复
后面的代码没用,实际也没有,只是说明一点,temp必须存在,可以如下
template< typename RET, typename TEMP, typename TYPE1, typename TYPE2 >
RET max( TYPE1 a, TYPE2 b, TEMP &temp )
{
RET ret;
// 中间代码
ret = ( temp = ( a > b ? a : b ) ), temp;
return ret;
}
sevecol 2003-09-26
  • 打赏
  • 举报
回复
后面的代码呢?也贴出来吧
borlandband 2003-09-26
  • 打赏
  • 举报
回复
关注,学习。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧