计算符号的左右结合性决定了什么?

积木 2004-08-23 04:24:57
例如:
void f(int i)
{
cout<<i<<endl;
}
int main()
{
f(1)+f(2)+f(3)+f(4)+f(5);
return 0;
}
如果+为左结合,结果是什么?
如果是右结合,结果是什么?
不同的编译器结果不同是不是因为左右结合性不同?还是别的什么?呵呵
...全文
627 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunjueqian 2004-08-24
  • 打赏
  • 举报
回复
哦,解释得很清楚,谢谢:)
whyglinux 2004-08-24
  • 打赏
  • 举报
回复
C/C++标准规定了运算符的功能和它们的结合性。运算符的结合性在C和C++中是一致的,并且不能被改变。但是在C++程序中,由于可以对运算符进行重载,所以运算符的功能会发生变化,但是它的结合性仍保持不变。

运算符的结合性决定了同级运算符时的运算顺序。例如:对于表达式 a - b + c,+、-为同级运算符,左结合,因此它的运算顺序为 (a - b) + c,即先计算 a - b 的值,然后再与 c 相加。这个运算顺序对于任何的C/C++编译器都是一致的。

问题在于:C/C++标准没有规定操作数运算的先后顺序。这也就是说,对于上面的表达式,操作数 a、b 和 c 的计算顺序是不固定的。其原因在于:每个编译器采取的计算操作数顺序不同。对于同级运算,有的从左到右,有的与此相反;甚至有可能a、b、c的计算顺序取决于表达式中运算符的优先级。

表达式或者操作数的结果不应该倚赖于表达式中操作数计算的先后顺序。

例外情况是:&&、||、?: 和 ,。对于它们,C/C++标准明确规定了操作数的计算先后顺序。例如:对于a && b,一定是先计算 a,然后根据 a 的结果决定是否再计算 b。对于这些特殊情况,应该与一般情况加以区分。
sandrowjw 2004-08-24
  • 打赏
  • 举报
回复
顶……顶……顶一下
laomai 2004-08-24
  • 打赏
  • 举报
回复
三井,把MM介绍到值班室里来,大家可以考虑不追究你的责任,不然,嘿嘿......
bianliuwei 2004-08-24
  • 打赏
  • 举报
回复
星星发的帖子果真不错,用顶来表示支持.
积木 2004-08-24
  • 打赏
  • 举报
回复
这两天公司考C语言基础,结果就闹出来点东西,虽然代码不应该这么写
但是的确有很多细节将来就是bug的隐患,这个问题不大却有可能一时图省事就那么写了
真正好的写法还是
s+=f(i),就没有任何的问题了,呵呵
错误常常在无“意义”的地方发生
an9ryfr09 2004-08-24
  • 打赏
  • 举报
回复
支持楼上的!!!

TO 三井: MM漂不漂亮?
不明白MM为何问这种没有意义的问题,'+'是左结合还是右结合在ANSI里面已经明确说明了都。

比如'++'或'--',他们是右结合,所以a = ++b就会先算++b,a = b++就会先算a = b
wzzxq 2004-08-24
  • 打赏
  • 举报
回复
f()的返回值是void,可以放在运算符里吗??
yjh1982 2004-08-24
  • 打赏
  • 举报
回复
所谓结合性,指的是同优先级.....函数调用肯定比+操作优先级高.
所以fun(1)+fun(2)
两个fun先计算...然后再加.
fun(1)+fun(2)+fun(3)
有可能
先fun(1),后fun(2)两者相加后加上fun(3);再

fun(1),fun(2),fun(3)...在把他们的临时对象相加.
这两种情况都不会影响fun的调用顺序啊.

albertlee 2004-08-24
  • 打赏
  • 举报
回复
晕!!!!!!!!!!!

这种代码有意义吗?
这种C语言基础知识有意义吗?
pjg 2004-08-23
  • 打赏
  • 举报
回复
if(mm!=beauty)
{
for( ; ;)
{
textcolor(LIGHTRED);
printf("\n\n\n");
cprintf(" BS BS BS BS\n\r");
printf("\n\n");
asm push ax
asm mov ah,0
asm int 16h
asm pop ax
continue;
}
}
sunjueqian 2004-08-23
  • 打赏
  • 举报
回复
我认为运算符的左右结合性不能决定函数的计算顺序,只能决定压栈的顺序,但是函数值是在什么时候算的应该要看编译系统吧。这个问题本来是这样引起的(++i)+(++i)+(++i)=?,假如i的初值是1,可能的结果都有什么呢?6也是可能的结果吧,先计算的哪一部分呢?于是问题就被扩大了。我只是想,这个问题和运算符的结合性没有关系吧。不怎么会c,问题难免会很菜,不要见笑
sunjueqian 2004-08-23
  • 打赏
  • 举报
回复
打个招呼,大家好。我就是那个把三井兄说把他灭了的人,我觉得这个问题很值得讨论一下,所以谢谢大家赐教啊
zqpsswh 2004-08-23
  • 打赏
  • 举报
回复
函数和变量在计算机里都是以地址的方式被提取的
计算机处理的态度都是一样
zqpsswh 2004-08-23
  • 打赏
  • 举报
回复
可以把f(n)函数看是一个表达式的地址
左右的顺序将决定提取这个f(1)+...+f(5)的表达式的先后顺序
影响到最终的结果
积木 2004-08-23
  • 打赏
  • 举报
回复
今天被mm逼疯了
晨星 2004-08-23
  • 打赏
  • 举报
回复
在VC中,下面前后两次对12345的输出顺序的确是不一样的。应该是因为“+”和“=”的结合性不同吧?

#include <iostream>
using namespace std;

int g;

int& f(int i)
{
cout<<i<<endl;
return g;
}
int main()
{
f(1) = f(2) = f(3) = f(4) = f(5);
cout << endl;
f(1) + f(2) + f(3) + f(4) + f(5);
return 0;
}
laomai 2004-08-23
  • 打赏
  • 举报
回复
呵呵,一3井今天屡次犯下低级错误。
1、用void类型的数据参与加法计算
2、给分时采用系统默认的20分,
3、最最不可原谅的,被计算机MM的灭了,不但影响了星星的光辉形象,更败坏了值班室的名头,
兄弟们说说该怎么处理?呵呵。
pacman2000 2004-08-23
  • 打赏
  • 举报
回复
int f(int i)
呵呵。顺序应该跟编译器实现有关!
cxjddd 2004-08-23
  • 打赏
  • 举报
回复
我来说说,不一定对:
也许要说明一点,C 里的运算不一定满足交换律,所在其运算顺序有区别。
如果不是相同的运算符,那就应该按优先等级来,这个很明确。
如果是相同的话,那就看是左结合还是右结合了。很明显,左结合是指从左算到右,右结合是指从右算到左。

TC++PL 里说,一元运算符和赋值运算符是右结合的,其他运算符都是左结合的。
加载更多回复(13)

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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