| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3058 人关注过本帖
标题:问下条件表达式和赋值表达式
只看楼主 加入收藏
lockli222
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-8-27
收藏
得分:0 
回复 8楼 TonyDeng
那为什么 d=a=1?b=2:(c=3); 是能打印出a=2,b=2,d=2?
按照你的思路的话 应该 d=a=1?b=2 这里就已经报错了
新人求教
2013-02-19 12:46
lockli222
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-8-27
收藏
得分:0 
以下是引用TonyDeng在2013-2-17 15:18:42的发言:

你留意一下编译器给出的出错信息,那就是它的理解。

d = a=1?b=2:c=3;
一般地,编译器从左到右分析语句字符串,它可能先看到d=a=1这个赋值语句,然后把这个作为三目的第一项条件,发现了?是合法的,但第二项只会结合到b,被红色的=号拦断了,它会视这个等号为赋值语句,但这里的左边不是左值,无法赋值。也就是说,它理解的是这样:
((d=a=1)?b)=2:c=3;
这肯定不合法。

三目运算符,只是作三个表达式变换,不是什么严谨的语法。A ? B : C,编译器的处理是把这个表达式展开为if(A) { B } else { C },它要求A、B、C三项是完整的、合法的表达式。所以合适的写法是把三项均用圆括号括起来,让编译器能够轻松找到三目进行替换,否则由着它自己判断,往往出错。



代码与运行结果如下:#include <stdio.h>

int main(int argc, int **argv)
{
        int a=0;
        int b=0;
        int c=0;
        int d=0;
        d=a=1?b=2:(c=3);
        printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
        return 0;
}
[root@localhost yyDigital]# ./sanmu
a=2,b=2,c=0,d=2
2013-02-19 12:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
d=a=1?b=2:(c=3)
这个被编译器分析的结果,是
d=a=(1?b=2:(c=3))
红色是三目运算符,展开后的结果是赋值语句b=2,这个结果连续赋值,d、a,由于没有执行c=3,所以最终c是初始值0。

这应该是编译器反复扫描表达式后以最可能合法的方式理解,关键在(c=3)被圆括号括住,这是一个整体,与:能够结合起来,于是编译器认为这里必然存在三目运算符,而?后面是赋值语句,是正常的。根据执行结果看,这个编译器是从后往前扫描的。

还是原先的那句话,意图是什么,就尽量把它表达清晰,不要依赖编译器行为,把代码写清楚了,那些符号不会对实际运行有任何影响,但对正确性有决定性影响。楼主原先的意图,就是最后一种,全部用圆括号括住,就很清晰了,凡是试图减省个别括号的,后果如何,他自己尝试到了。其实楼主原先的意图,三目运算符第一项用赋值语句取代判断表达式,在一般情况下是疑点(这与if(a=1)的表述法一样可疑),但可能是他的真实动机,我就不挑那个刺了。

[ 本帖最后由 TonyDeng 于 2013-2-19 14:31 编辑 ]

授人以渔,不授人以鱼。
2013-02-19 13:23
lockli222
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-8-27
收藏
得分:0 
以下是引用TonyDeng在2013-2-19 13:23:27的发言:

d=a=1?b=2:(c=3)
这个被编译器分析的结果,是
d=a=(1?b=2:(c=3))
红色是三目运算符,展开后的结果是赋值语句b=2,这个结果连续赋值,d、a,由于没有执行c=3,所以最终c是初始值0。

这应该是编译器反复扫描表达式后以最可能合法的方式理解,关键在(c=3)被圆括号括住,这是一个整体,与:能够结合起来,于是编译器认为这里必然存在三目运算符,而?后面是赋值语句,是正常的。根据执行结果看,这个编译器是从后往前扫描的。

还是原先的那句话,意图是什么,就尽量把它表达清晰,不要依赖编译器行为,把代码写清楚了,那些符号不会对实际运行有任何影响,但对正确性有决定性影响。楼主原先的意图,就是最后一种,全部用圆括号括住,就很清晰了,凡是试图减省个别括号的,后果如何,他自己尝试到了。其实楼主原先的意图,三目运算符第一项用赋值语句取代判断表达式,在一般情况下是疑点(这与if(a=1)的表述法一样可疑),但可能是他的真实动机,我就不挑那个刺了。



我刚在我们的编译环境做了1?b=2:(c=3)的执行,这个格式的三目运算确实是可以的,当然正如你所说还是添加上括号上为好,将自己的意图精确表达出来。谢谢你的回复
2013-02-20 11:10
快速回复:问下条件表达式和赋值表达式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036005 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved