假设我们有字符串t
。
为什么以下不起作用:
for (int i = 0; i < t.length; t++)
{
t.charAt(i)+=3;
}
答案 0 :(得分:5)
如果您正在谈论Java,那是因为+=
运算符是赋值运算符,您将尝试为从方法调用返回的值赋值。
而不是试图以这种方式直接操纵String,get a character array并操纵它。然后是create a new String with the resulting array。
答案 1 :(得分:1)
因为charAt
返回一个值,而不是引用。我知道你可以分配给函数返回值的唯一语言是C ++,只有当函数返回一个引用时,你才能这样做。
你可以char c = t.charAt(3); c += 3;
但这只会改变变量c的值,它不会改变t。
为了改变你需要像t.setCharAt(3, t.charAt(3)+3);
或t[3] += 3;
这样的东西,但是因为在大多数现代OO语言(如Java或C#)中,字符串是不可变的方法,如setCharAt
don不存在。
答案 2 :(得分:1)
正如Marks所说,你没有提到你的编程语言。对于大多数编程语言,您无法分配函数的返回值(+=
是一个赋值)。 C ++是一个例外,但是给定了方法的名称(charAt
),看起来你正在使用Java或者C#。要设置角色,如果字符串可以变异,则需要使用某种setChar
方法。在Java和C#中,字符串是不可变的,因此一旦创建它们就无法更改。您唯一的选择是创建一个包含转换后的字符的新字符串。
因此,有几个原因,假设Java或C#,为什么代码不起作用:
答案 3 :(得分:1)
String类是不可变的 - &gt;你无法修改字符串实例。
您将看到字符串方法不会修改当前实例,只会创建一个新字符串。
例如string.toLowerCase()将保持字符串相同并返回一个新的字符串实例...
还有其他原因,它不正确,因为charAt返回一个原始类型 就像写下这样的东西: 3 = 5 + 2 你的意思是3的新值是7吗? 那么当你做3 + 1时它返回8? :d
答案 4 :(得分:0)
你没有提到你的编程语言。
我假设你正在使用C#。在C#中你不能交替一个字符串。您只能创建新的。 因此t.charAt是只读的,不能与你的+ =操作交替。 如果你想做这样的事情,可以使用char数组或StringBuilder类。
编辑: .NET没有方法string.charAt()所以看起来你正在使用另一种编程语言。但我认为它也是同样的问题。
答案 5 :(得分:0)
正如其他人所说的那样,Java字符串是不可改变的,并且是好的reason。由于这些原因,我尝试尽可能多地使我的类不可变。在我看来,其中最引人注目的是它们在没有锁定的情况下是线程安全的。