Bootstrap

C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?

C#: String s = new String("Hello")无法编译?

C# String类型是literal常量,默认不能用new创建,但可以在unsafe下用char *字符串指针创建。

  • char* charPtr = stackalloc char[2];
    charPtr[0] = 'H';
    charPtr[1] = '\0';

    String myString = new String(charPtr);
    Console.WriteLine(myString); // 输出: H

编程语言字符集有两个?

编程语言一般有两个字符集,一个是源码字符集,一个是编码字符集。

  • 源代字符集很好理解,对应源代码本身的编码格式。
  • 编码字符集一般指示源代码中"字符串"的编码格式,对应MSVC和GCC编译选项中叫做"执行字符集"。编译选项分别是/execution-charset和-fexec-charset.

出现这两个字符集的原因,可以参考为什么VS编译UTF-8格式源代码, 代码中字符串却是ANSI编码?.

ObjC语言NSString *s = @"a我a" 字符串的长度是多少?

首先要清楚,如果是GCC编译,默认源代码需要的UTF-8格式,NSString类型字符串s也是按UTF-8格式保存,即字符串s的raw data是61 e6 88 91 61. s的长度[s length]并不是5,而是3. NSString的length属性是按字符个数,而非字节个数,UTF-8中文是三个字节,只是一个字符。

NSString *s = @"hello"变量s是不可变的吗?

先说结论,s指针是可变的,可指向其他对象,但@"hello"字符串字符本身不可变。编程语言设计的不可变字符串是指对应的字符串不可被修改,可以共用、优化处理。但它返回给一个指针保存,此指针本身所指向地址是可以修改的,但内容不能改变。如果需要s不可指向其他地址,可以加const约束,例如NSString * const s = @"Objective-C";

为什么这种变量名“\u0061\u0062”都能编译通过?

支持Unicode字符集的编译器,可以支持\u0061\u0062这种命名,其实就是ab. 例如:

  • C#/Java可以用int \u0061\u0062 = 12初始化变量ab的值为12. 可以用ab或者\u0061\u0062引用此变量。
  • JavaScript(ES6以上版本)同样也支持这种命名方法。
  • C++11开始比较完整地支持Unicode, 不能用上面的形式作为变量名,但可使用形如L"\u0061\u0062"初始化字符串。
  • C语言对于Unicode的支持一直不好,就算最新的GCC14一样如此。

为什么可以用中文命名标识符变量?

随着编程语言国际化发展,很多主流编程语言都从早期只支持ASCII码变量名到支持用Unicode字符串命名变量名。

  • C99和C++11开始支持Unicode字符集命名变量。
  • ObjC/ObjC++根据所用的C或C++编译器版本决定是否支持。
  • Swift/C#/Java/JS均支持Unicode字符集命名变量。
    例如Swfit: let 数量 = 10

ObjC NSString字符串常量编码格式是编译器决定还是ObjC语言规范决定?

如下为例,NSString *s = @"a我a",以GNUStep GCC编译器为参考,用默认UTF-8源代码编码格式,字符串s是UTF-8编码。gcc编译器增加-fexec-charset=GB2312修改字符串编码,可以编译通过,s就变成了GB2312编码格式。这说明,NSString字符串编码是跟随编译器的设定,而非所谓ObjC语言规范,ObjC语言本身也没有这个规范。

C#: 如下字符串String s = "a" + Environment.NewLine + "b"在不同平台不同?

  • Windows: Environment.NewLine为"\r\n", 长度为2.
  • Linux: Environment.NewLine为"\n", 长度为1.

标题这行代码分别在Windows和Linux编译,结果将不同。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

;