为何输出char的默认值时,输出了a

wxzdxds 2015-08-13 03:24:42
今天用vs2013用c#输出char的默认值,结果输出了a,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 开始
{
class Program
{

static void Main(string[] args)
{
char y = new char();
Console.WriteLine(y);
}
}
}
但我查了很多地方,连msdn中也说char的默认值是'\0',那么为何会输出a
...全文
537 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
changuncle 2016-10-29
  • 打赏
  • 举报
回复
这个问题挺有意思,值得探讨一下,而且又很多大神的回答都很精彩,谢谢各位。
wxzdxds 2015-08-18
  • 打赏
  • 举报
回复
引用 16 楼 Moshangpengyou 的回复:
空格。。。。
。。。。
wxzdxds 2015-08-18
  • 打赏
  • 举报
回复
引用 18 楼 unearth 的回复:
请问大哥,你纠结这事,做什么 ?
原本是想看不写构造器会把没初始化的字段初始化什么,结果发现char变量竟输出a,然后我单独来试试
wxzdxds 2015-08-18
  • 打赏
  • 举报
回复
引用 15 楼 shingoscar 的回复:
[quote=引用 14 楼 wxzdxds 的回复:]
只能说太神奇了,猜测是字体的关系吧,附上我的结果 [/quote] 字体的关系指什么?
於黾 2015-08-18
  • 打赏
  • 举报
回复
你应该先断点跟,看c到底是什么,而不是通过输出到控制台再看 很多不同的字符输出出来看起来都一个样 你应该直接看它的编码到底是不是0
wxzdxds 2015-08-18
  • 打赏
  • 举报
回复
引用 19 楼 dongxinxi 的回复:
应该是跟输出流的编码有关,默认是取当前系统的代码页编码,你设置Console.OutputEncoding = Encoding.UTF8;应该就好了 MSDN上讲的很清楚,反复提到了编码 https://msdn.microsoft.com/zh-cn/library/system.console(v=vs.110).aspx 另外一帖也遇到了类似的问题,相同的字节流,不同系统上打印出来不同 http://bbs.csdn.net/topics/391808344?page=1#post-400276431
那个位置到那个位置讲了https://msdn.microsoft.com/zh-cn/library/system.console(v=vs.110).aspx
wxzdxds 2015-08-18
  • 打赏
  • 举报
回复
引用 23 楼 shingoscar 的回复:
[quote=引用 20 楼 wxzdxds 的回复:]
字体的关系指什么?

我的是win7,cmd里默认字体是Terminal
你看14楼的图,字体明显是不同的
如果这种字体显示\0时候就是a那种样子,就可以解释了[/quote]
我的字体应该也是Terminal,然后你看我的新代码,竟然也是true

Poopaye 2015-08-18
  • 打赏
  • 举报
回复
引用 20 楼 wxzdxds 的回复:
字体的关系指什么?
我的是win7,cmd里默认字体是Terminal 你看14楼的图,字体明显是不同的 如果这种字体显示\0时候就是a那种样子,就可以解释了
  • 打赏
  • 举报
回复
应该是跟输出流的编码有关,默认是取当前系统的代码页编码,你设置Console.OutputEncoding = Encoding.UTF8;应该就好了 MSDN上讲的很清楚,反复提到了编码 https://msdn.microsoft.com/zh-cn/library/system.console(v=vs.110).aspx 另外一帖也遇到了类似的问题,相同的字节流,不同系统上打印出来不同 http://bbs.csdn.net/topics/391808344?page=1#post-400276431
孤独de猫 2015-08-16
  • 打赏
  • 举报
回复
请问大哥,你纠结这事,做什么 ?
把分全给哥 2015-08-16
  • 打赏
  • 举报
回复
重装系统啊
Moshangpengyou 2015-08-16
  • 打赏
  • 举报
回复

空格。。。。
Poopaye 2015-08-16
  • 打赏
  • 举报
回复
引用 14 楼 wxzdxds 的回复:

只能说太神奇了,猜测是字体的关系吧,附上我的结果
wxzdxds 2015-08-16
  • 打赏
  • 举报
回复
引用 13 楼 shingoscar 的回复:
[quote=引用 10 楼 sinat_19702345 的回复:]
我的输出也是a

敢不敢截个图出来?[/quote]
Poopaye 2015-08-15
  • 打赏
  • 举报
回复
引用 10 楼 sinat_19702345 的回复:
我的输出也是a
敢不敢截个图出来?
wxzdxds 2015-08-15
  • 打赏
  • 举报
回复
引用 6 楼 willhuo 的回复:
本来这东西就没有意义,new一下,申请一个堆,只是申请,里边到底原来是什么,不知道,默认应该是空,或者那个内存区域本来有东西,你支付覆盖了而已,也可能覆盖的内存地址里边就是a,也不一定。这东西得深刻的查一下计算机原理哪里,而且看一下new char的底层是怎么操作的
这不是默认值的问题吗?就像Int的默认值是0,我用Int i=new Int();然后输出i就会输出0
wxzdxds 2015-08-15
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 4 楼 Aiden_Lee 的回复:] 应该是空输出。。。
不可能是空,是有1个字节的。 这个输出是确定的,不需要瞎猜,而是应该去看看 char.ToString() 方法的源代码。[/quote] 这个和char.tostring()有什么关系?
Aiden_Lee 2015-08-14
  • 打赏
  • 举报
回复
应该是空输出。。。
  • 打赏
  • 举报
回复
引用 6 楼 willhuo 的回复:
本来这东西就没有意义,new一下,申请一个堆,只是申请,里边到底原来是什么,不知道,默认应该是空,或者那个内存区域本来有东西,你支付覆盖了而已,也可能覆盖的内存地址里边就是a,也不一定。这东西得深刻的查一下计算机原理哪里,而且看一下new char的底层是怎么操作的
这是.net,不是c!因此任何对象的初始化都是有确定知道的初始化值的,而不是什么“不知道”。
  • 打赏
  • 举报
回复
引用 4 楼 Aiden_Lee 的回复:
应该是空输出。。。
不可能是空,是有1个字节的。 这个输出是确定的,不需要瞎猜,而是应该去看看 char.ToString() 方法的源代码。
加载更多回复(6)
Java的 的8⼤基本数据类型 ⼤基本数据类型 Java8⼤基本数据类型 ⼤基本数据类型   byte(字节型)、short(短整型)、int (整型) 、long(长整型)   float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、char(字符型) 整型   byte数据类型是8位, 1个字节,默认值:0,取值范围:(-128 - 127);   short数据类型是16位,两个字节,默认值:0,取值范围:(-2^15 - 2^15 -1);   int 数据类型是32位,4个字节,默认值:0,取值范围:(-2^31 - 2^31 -1)   long数据类型是64位,⼋个字节,默认值:0L,整型常量若要声明为long类型,需要在数字后加上l或L,long a = 10000L; 浮点型   float数据类型是单精度、32位浮点数;默认值:0.0f,若要定义float类型的变量需要在⼩数后⾯追加f或者F,float a= 2.3f;   double数据类型是双精度、64位、符合IEEE 754标准的浮点数;默认值:0.0d,double d = 2.3;   描述整数默认⽤int,描述⼩数默认⽤double。long⼀般⽤于描述⽇期、间、内存、⽂件⼤⼩,IO处理⼀般使⽤byte 字符型   char⼀般⽤于描述中⽂(基本忽略),取值范围:(\u0000 - \uffff) —>(0 - 65535);,字符型⽤' '表⽰;char ch = 'A',   char和int可以相互转换,char转int直接赋值,int 转char强转。 布尔型   boolean表⽰⼀位的信息,只有两个取值:true和false,默认值:false 每个数据类型对应的包装类中都有对应的SIZE属性返回位数,MIN_VALUE和MAX_VALUE返回该数据类型最⼩值和最⼤值。 public class PrimitiveTypeTest{ public static void main(String[] args){ //byte System.out.println("基本类型:byte ⼆进制位数:" + Byte.SIZE); System.out.println("包装类:java.lang.Byte"); System.out.println("最⼩值:Byte.MIN_VALUE = " + Byte.MIN_VALUE); System.out.println("最⼤值: Byte.MAX_VALUE = " + Byte.MAX_VALUE); // char System.out.println("基本类型:char ⼆进制位数:" + Character.SIZE); System.out.println("包装类:java.lang.Character"); // 以数值形式⽽不是字符形式将Character.MIN_VALUE输出到控制台 System.out.println("最⼩值:Character.MIN_VALUE=" +(int)Character.MIN_VALUE); // 以数值形式⽽不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println("最⼤值:Character.MAX_VALUE="+(int) Character.MAX_VALUE); } } 运⾏结果: 基本类型:byte ⼆进制位数:8 包装类:java.lang.Byte 最⼩值:Byte.MIN_VALUE = -128 最⼤值: Byte.MAX_VALUE = 127 基本类型:char ⼆进制位数:16 包装类:java.lang.Character 最⼩值:Character.MIN_VALUE=0 最⼤值:Character.MAX_VALUE=65535 Float和Double的最⼩值和最⼤值都是以科学计数法的形式输出的,结尾的"E + 数字"表⽰E之前的数字要乘以10的多少次⽅。 eg:1.4E-45 —> 1.4 10^(-45) 数据类型转换必须满⾜如下规则: 数据类型转换必须满⾜如下规则:   1.不能对boolean类型进⾏类型转换   2.不能把对象类型转换成不相关类的对象   3.⼩的数据类型与⼤的数据类型做数值运算,⼩的数据类型会⾃动提升为⼤的数据类型。   4.⼤的数据类型要转为⼩的数据类型必须强转,强转可能会丢失数据。   5.浮点数到整数的转换是通过舍弃⼩数得到,⽽不是四舍五⼊   低级--------> ⾼级   byte,short,char->int->long->float->double 举例说明: p

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧