加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读