java - 为什么在常量(字符)上使用变量时异或运算的工作方式不同

标签 java c# c++ c expression

<分区>

看看下面的代码:

案例 1:

char a = 'x' ^ 'y';

它工作正常。 但是当我在这里使用变量而不是常量时:

案例 2:

char x = 'x';
char y = 'y';
char a = x ^ y; // Error!

In java language : case 1 is working and value of a comes out to be 1 but case 2 is not working.

In C and C++ : both cases are working, and the value of a comes out to be 1

In C# : both the cases are not working.

In javascript : both cases are working, which is not a HLL, and value of a comes out to be 0.


我知道 java 正在将变量转换为整数以进行二进制操作,但为什么它在情况 1 中有效而不在情况 2 中有效,为什么在 C# 中不起作用以及为什么值在 javascript 中不同。

已更新 当我将变量设置为 final 时,它可以在 Java 中使用,但在 C# 中仍然不行

final char x = 'x';
final char y = 'y';
char a = x ^ y;

但我仍然无法理解为什么常量有效,但在使用变量时却无效。为什么其他高级编程语言没有发生同样的事情。
我认为这是一个基本操作,应该适用于具有相同行为的所有编程语言。

Note To test all above cases in javascript I am replacing 'char' with 'var' in all cases and they are working.

最佳答案

仅针对 Java 回答。

表达式 'x' ^ 'y' 是一个 constant expression ; x ^ y 不是,除非两个变量都声明为 final。此外,结果是 int^ 是一个 integral bitwise operator ,这意味着两个操作数都必须是 promoted在评估之前转换为整数类型。 char 提升为 int

所以你有这个 int 表达式,你试图将它缩小到 char。在一般情况下,这可能会导致精度损失(整数是 4 个字节,字符是 2 个字节),因此编译器不会让你在没有明确说明你想要做什么的情况下这样做(通过强制转换为 字符)。 但是,如果常量表达式的值适合新类型,您可以隐式地缩小常量表达式的范围。来自 JLS 5.2 :

  • A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.

(强调)

直觉上,这是完全有道理的:错误的存在是为了告诉您可能会失去精度,因此它希望您确认自己知道这一点;从某种意义上说,这是一个响亮的警告。但是,如果编译器可以绝对地知道这不会发生,就像常量表达式一样,那么它会让您的事情变得更容易一些并“隐藏”该警告。

关于java - 为什么在常量(字符)上使用变量时异或运算的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206097/

相关文章:

java - 关于 setter和getter 的问题

java - SLF4J 与 Jboss 日志记录

c# - 在 WebAPI 2 中控制 DateTime 参数格式

c++ - 如何在调试时将 Visual Studio 配置为 'skip' 智能指针代码?

c++ - 调整结构的 vector 元素大小 - segv

java - 当字符有8位时,InputStream与InputStreamReader相同吗?

java - Oracle 将 ""变为 NULL

c# - Windows 商店应用程序 ScrollViewer.ChangeView() 不工作

c# - xml配置文件中unity : pass parameters to custom lifetime constructor,

c++ - 如何创建独立于平台的宏来包装编译器扩展?