还是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);