一个关于符号优先级的问题。

已知int c=3,d=4,k=0判断一下正误。(帮忙解释为什么)
c||(d=k)执行后d的值为0
!c!=(d!=k)表达式的值为1
第一个是错的,第二个是对的,不懂

c||(d=k)括号优先级高,d=k是赋值语句,所以d=0,c||0=0
!c!=(d!=k)同理,括号内优先级高 (d!=k)先执行, !=是判断,所以(d!=k)的值为1,逻辑非(!)的优先级高于!=,所以再进行!c的运算,结果是0,最后进行中间的那个!=的运算,即0!=1,当然是1啦
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-06
c||(d=k)执行后d的值为0 错误
c||(d=k) 执行后 d的值为4 因为c不为0,非零值都为真,而对于或运算只要有一个环节为真,那整个表达式就是真,并且这个表达式是从左向右求值的,所以d=k不会执行 所以d保持原来的值

!c!=(d!=k) 表达式的值为1 ,正确

因为!的优先级高于!=, 所以!c!=(d!=k)也就是
(!c)!=(d!=k) d!=k就是4!=0,为真 !c就是!3 为假 最后就是0!=1 结果是1追问

可是(d=k)应该优先极高啊,不会先执行么

追答

你没有理解优先级的含义,优先级高不是先执行,而是操作符两端的操作数优先和这个操作符结合

追问

能详细说一下么,不太懂

追答

比如
a+b+c*d 因为*优先于+, 所以c*d是一个整体,而不是b+c,但是求值次序仍然是先求a+b,然后才是c*d

本回答被提问者和网友采纳
第2个回答  2012-08-06
c || (d = k) //首先做括号里面的 d = k; 即把k 的值赋给d , 所以d的值为0

!c != (d != k); //先判断括号里面的 上面的一句让d = k; 所以(d != k) 这句的值为假 即0
然后 !c != 0; 首先是!c c=3, !c的值是不等于0的 所以!c != 0这句是真的,故这个表达式的值为1
第3个回答  2012-08-06
第一个错误,d=k是个判断语句,不是赋值语句
第二个错误,d!=k返回值1,然后再计算c!=1,返回值仍为1,然后再计算!1,返回值为0
第4个回答  2012-08-06
c||(d=k) 把k的值赋给d d就是0了啊
!c!=(d!=k) d!=k 这句是真 为1 !c!=1 为真 是1
相似回答