| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3058 人关注过本帖
标题:问下条件表达式和赋值表达式
只看楼主 加入收藏
者好爱程编
Rank: 2
等 级:论坛游民
帖 子:68
专家分:46
注 册:2011-8-22
结帖率:83.33%
收藏
已结贴  问题点数:50 回复次数:13 
问下条件表达式和赋值表达式



程序代码:
#include <stdio.h>
int main()
{
    int a, b, c, d;

    //d = a=1?b=2:c=3; //编译器报错
    printf("a = %d b = %d c = %d d= %d\n", a, b, c, d);
   

    d = a=1?b=2:(c=3);
    printf("a = %d b = %d c = %d d= %d\n", a, b, c, d);
   

    d = a=1?(b=2):(c=3);
    printf("a = %d b = %d c = %d d= %d\n", a, b, c, d);
   

    d = (a=1)?(b=2):(c=3);
    printf("a = %d b = %d c = %d d= %d\n", a, b, c, d);

    return 0;
}

只有 d = (a=1)?(b=2):(c=3); 才是想要的结果

知道 条件表达式的优先级高于赋值表达式 还理解不了

求指教
搜索更多相关主题的帖子: 表达式 
2013-02-17 12:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看看你自己的发帖和跟帖历史,今时今日还犯这种错误、问出这种问题。

授人以渔,不授人以鱼。
2013-02-17 12:40
者好爱程编
Rank: 2
等 级:论坛游民
帖 子:68
专家分:46
注 册:2011-8-22
收藏
得分:0 
回复 2楼 TonyDeng
您批评的对,以前荒废了,努力学习,向大家看齐。
2013-02-17 13:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那现在知道怎么回事了吗?

授人以渔,不授人以鱼。
2013-02-17 14:05
者好爱程编
Rank: 2
等 级:论坛游民
帖 子:68
专家分:46
注 册:2011-8-22
收藏
得分:0 
回复 4楼 TonyDeng
a=1?b=2:c=3;   就是  a = (1?b=(2:c=3)); 所以报错

感觉还是不对

求指教

感谢您的批评自己会努力的
2013-02-17 14:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
见过a=b=f(x)这种形式的语句吗?你觉得编译器会怎么理解你那句注释掉的语句?

授人以渔,不授人以鱼。
2013-02-17 14:46
者好爱程编
Rank: 2
等 级:论坛游民
帖 子:68
专家分:46
注 册:2011-8-22
收藏
得分:0 
回复 6楼 TonyDeng

a = (1?b=2:c) =3;

明白了 三目运算符 左右两端只能结合一个值或变量

不知道是不是这样

感谢


ps:
    左右两端只能结合一个值或变量
    这句话不太对  

    还是自己没有理解优先级


[ 本帖最后由 者好爱程编 于 2013-2-17 15:10 编辑 ]
2013-02-17 15:02
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,被红色的=号拦断了,它会视这个等号为赋值语句,但这里的左边不是左值,无法赋值。也就是说,它理解的是这样:
((d=a=1)?b)=2:c=3;
这肯定不合法。

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

授人以渔,不授人以鱼。
2013-02-17 15:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:50 
良好的忠告是:如果写出来阅读的不是特别清晰,就不要使用三目运算符,回归判断语句。事实上,三目运算符在编译之后,也是被展开为判断语句的,不是你源代码写起来是一行,它就真的是一行了,以为比判断语句更简洁,完全不是那回事。把代码写清晰才是最重要的,靠什么优先级来节省几个符号和行数,得不偿失。

授人以渔,不授人以鱼。
2013-02-17 15:34
者好爱程编
Rank: 2
等 级:论坛游民
帖 子:68
专家分:46
注 册:2011-8-22
收藏
得分:0 
回复 9楼 TonyDeng
谨记 和增加可读性
2013-02-17 16:42
快速回复:问下条件表达式和赋值表达式
数据加载中...
 
   



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

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