public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String l,b;
for(int i=0;i<(s.length()-2);i++) {
if(i==0) {
l=s.substring(i,i+3);
s.substring(i,i+3).compareTo(s.substring(i+1,i+4))>0
? l=s.substring(i,i+3)
: l=s.substring(i+1,i+4); // assigned values
s.substring(i,i+3).compareTo(s.substring(i+1,i+4))<0
? b=s.substring(i,i+3)
: b=s.substring(i+1,i+4);
}
为什么它显示变量i和b未分配?
答案 0 :(得分:0)
首先, 无法 嵌套三分配给l
和b
,就像您似乎想要做的那样(而且您似乎也 尝试 并为两者分配相同的值。您可以在循环之前执行此操作,如
b = l = s.substring(0, 3).compareTo(s.substring(1, 4)) > 0 ?
s.substring(0, 3) : s.substring(1, 4);
然后将您的初始循环条件设为1
,如
for (int i = 1; i < (s.length()-2); i++) {
// ...
}
如果循环从0
开始,则无需测试1
。
答案 1 :(得分:0)
三元表达&#39;目的是返回值。具体而言,表达式具有从两个可能值中选择的值,具体取决于条件。然后可以在任何其他表达式可以使用的任何地方使用该值,例如
x = (isSomeTestTrue()) ? 2 : 5;
System.out.println((isSomeOtherTestTrue()) ? "this" : "that");
您尝试使用它代替if
声明。也就是说,您要在?
和:
部分放置有效的语句,并忽略表达式的值:
s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0
? l = s.substring(i,i+3)
: l = s.substring(i+1,i+4);
不要这样做。这不是三元表达式的用途。并且它不会一直有效(我认为使用这样的三元表达式可能不足以满足l
的明确赋值和规则的规则,尽管规则是很复杂,我还在努力解决这些问题。注意:在某些语言中,这可能是可接受的习惯用法,例如Perl或JavaScript。但我认为你不应该用Java或C#来做这件事。
如果您有两个语句,并且您希望在条件为真时执行一个语句,而另一个语句为假,则使用if
。
if (s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0) {
l = s.substring(i, i+3);
} else {
l = s.substring(i+1, i+4);
}
或者,在这种情况下,您可以使用三元运算符并将结果分配到l
:
l = (s.substring(i, i+3).compareTo(s.substring(i+1, i+4)) > 0)
? s.substring(i, i+3)
: s.substring(i+1, i+4);