关于c语言中条件运算符的问题

[复制链接]
查看11 | 回复7 | 2011-8-24 09:03:36 | 显示全部楼层 |阅读模式
#includestdio.h#definePprintf#defineSscanfvoidmain(){inta;//我知道这里错了,但是输入B,会输出B,为什么呢?S(\"%c\",a=(a=\'A\'=\'Z\')?(a32):a;P(\"%c\\n\",a);}
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
这是整型数据和字符数据所占内存单元长度不同引起的问题。inta;声明的a变量在编译器编译后分配了2个或4个字节(取决与哪一种编译器),不管是哪种编译器,a所占空间都超过1个字节。S(\"%c\",使得a变量的其中一个字节有值了,但是还有其他字节的内容没赋值,其他字节的内容是随机的。所以(a=\'A\'=\'Z\')的真假性无法判断,于是a=(a=\'A\'=\'Z\')?(a32):a;的结果可能是a32,也可能是a本身。你可以在a=(a=\'A\'=\'Z\')?(a32):a;之前加一个语句P(\"%d\\n\",a);观察a变量的实际值。而你最后P(\"%c\\n\",a);只输出了一个字节的内容,(有可能没改变)。
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
你输入的是defds123a的值,它不在A跟Z之间,所以输出的还是a追问?defds123a不就是赋值给a的意思么?
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
我知道。。。。但我想知道我输错了但还是能输出得数,这是为什么a=(a=\'A\'=\'Z\')?(a32):a;输错了条件语句为假a=a啊,
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
但是可以转化为ascll码啊,inta,输入B,B不就是66了么。
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
关键是你没有转化,int是整形
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
数据类型不匹配,inta改为chara追问我知道。。。。但我想知道我输错了但还是能输出得数,这是为什么
回复

使用道具 举报

千问 | 2011-8-24 09:03:36 | 显示全部楼层
楼主注意,结合顺序不等于求值顺序。条件表达式的求值顺序是这样规定的:test?exp1:exp2;条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。该运算符是右结合的值是要告诉你:后面不管跟了多大多长的表达式只要它是合法的那就整个被看作exp2。所以ab?a:cd?c:d当然相当于ab?a:(cd?c:d)别说你后面只是一个(cd?c:d),就算你后面是优先级比条件运算符还高的操作符组成的表达式,它也得按照条件运算符的求值规则求值。比如说ab?(x=200):(xy);加号的优先级比条件运算符高好几个等级,答案还不是照样是200。这样,我看inta=xy?(x=200):(y=350);就不要我再作解释了吧!追问你不要再解释了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行