java – 如何调用此构造以及哪些语言支持它?
发布时间:2020-12-15 04:11:38 所属栏目:Java 来源:网络整理
导读:Java不支持此构造: if ((int ext_pos = fname.lastIndexOf('.')) = 0) fname = fname.substring(0,ext_pos); (编译时我遇到语法错误). 但是,其他一些语言支持这样的东西,例如,我可以写的Perl if (defined (my $foo = $bar{$baz})) { ... do stuff with $bar
Java不支持此构造:
if ((int ext_pos = fname.lastIndexOf('.')) >= 0) fname = fname.substring(0,ext_pos); (编译时我遇到语法错误). 但是,其他一些语言支持这样的东西,例如,我可以写的Perl if (defined (my $foo = $bar{$baz})) { ... do stuff with $bar ... } # $bar does not exist here 显然,这更像是语法糖而不是其他任何东西,因为人们可以用Java重写它 { int ext_pos = fname.lastIndexOf('.'); if (ext_pos >= 0) fname = fname.substring(0,ext_pos); } 以3行额外代码为代价. 这个结构如何调用? (奖金问题:哪种语言支持它?为什么Java& C不支持它?) 解决方法
Java允许在表达式内进行赋值,但不允许变量声明(感谢更正biziclop!). C传统上有相同的限制,但我发现了另一个描述如何
declarations are allowed in conditions in the C++03 standard的stackoverflow帖子.语法是有限的,但这是允许的(在GCC 4.2.1上测试):
int x = 1; if (int y = x) cout << "y = " << y << endl; 请注意,正如biziclop所指出的,这具有将y的范围限制在条件内的优良特性.如果您尝试在条件之外使用y,则会收到错误: int x = 1; if (int y = x) cout << "y = " << y << endl; cout << y; // error: ‘y’ was not declared in this scope 我认为实际上没有这个名称 – 它只是允许在表达式中声明.我认为拥有自己的专业术语并不常见. 至于语言支持. JavaScript支持这一点,因为它允许在表达式中进行赋值,如果你在JavaScript中引用未声明的变量,它只是假定它是全局的. if (x = 1) alert(x) // x is global,assigned 1 alert(x) // since x is global it's still in scope and has value 1 基本上,声明是表达式的任何语言都允许您这样做.在大多数函数式编程语言中(例如Haskell,ML,Lisp),基本上所有东西都是一个表达式,因此你可以在条件中声明新的变量绑定(但它们在条件体中不可用).这是Clojure的一个例子: (println ; print the result of the conditional (if (let [x 1] ; declare local binding x = 1 (== x 2)) ; check if x == 2 "is two" ; true branch result "isn't two")) ; false branch result (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |