还是973写代码时遇到的优先级的小问题,现在看不就是加个括号就能避免的问题么….


我说的「问号表达式」指的是形如

a ? b : c

的语句..


今儿写东西的时候遇到一个未知的错误,我在sysout里使用了问号表达式,做了判断,但判断似乎没有用,仍然访问了空指针

table.setText(2, 1, "-  [复查日期: + record.getReexamineDate() == null ? "无" : DateTimeUtil.parseDate(record.getReexamineDate()) + "]");

于是我就很纳闷了,怎么可能呢,不是判断了吗,我换成显式的if else语句,OK了,就是这里的问号表达式的问题了!

测试代码:

System.out.println(record.getReexamineDate() == null ? "无" : DateTimeUtil.parseDate(record.getReexamineDate()));

只打印这个也是正常的,对整个问号表达式加上括号,结果也是正常的,看来就是优先级的问题了!


再说C++,我想试试C++下有没有这样的情况,于是代码:

cout << p == NULL ? "1" : p->pCh;

运行时就崩了啊~~~

看来这样写在Java下可以,在C++下不可以…是Java的toString()的缘故?

毫无疑问,C++下这样的代码肯定也是不行的了:

cout << "haha" << p == NULL ? "1" : p->pCh;

看来像这样的代码都还是加上一个()比较保险吧,毕竟问号表达式是好几个token组成的,并没有像()那样拥有更高的优先级。

我猜像下边的代码,是先”a”然后p == null,然后 (“a” + p==null),然后才是?

System.out.println("a" + p == null ? "1" : p.str);