You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个看似同名的Java变量可正常运行?请解释该现象

为什么这段Java代码没报错还输出了Success?

嘿,这问题乍一看有点反直觉对吧?让我帮你拆解下里面的门道——核心原因是两个看起来一模一样的"p",其实根本不是同一个字符!

先把代码贴出来仔细看:

public class Main { 
    public static void main(String[] args) { 
        int р = 0; 
        int p = 1; 
        if(р == 0 && p == 1) { 
            System.out.println("Success!"); 
        } 
    } 
}

你仔细瞅第一个变量的"р"——它不是英文里的小写字母p(ASCII编码0x70),而是西里尔字母的小写р(Unicode编码0x0440)!这俩字符肉眼几乎看不出区别,但在Java的标识符规则里,它们是完全独立的合法变量名。

Java允许使用Unicode字符作为标识符(只要符合语言规范里的规则),所以这两个变量本质上是完全不同的:

  • 第一个变量р(西里尔)被赋值为0
  • 第二个变量p(英文)被赋值为1

所以后面的判断条件р == 0 && p == 1其实是在判断两个不同变量的取值,结果自然是true,于是就执行了打印"Success!"的代码。

这种情况属于**同形异义字符(homoglyphs)**的陷阱,在编程里特别容易让人踩坑——尤其是复制粘贴代码的时候,一不小心就会引入这种肉眼难以分辨的字符,导致看似奇怪的行为。

内容的提问来源于stack exchange,提问作者ziMtyth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:41:55