【问题与思考】1+"1"=?
概述
在数学中1+1=2,在程序中1+1=2,而1+"1"=?
围绕着1+"1"的问题,我们来思考下这个问题。
目录:
一、在.Net代码中
二、在JavaScript代码中
三、在SQLServer代码中
四、在PowerShell代码中
五、还有更多的语言值得我们去探讨
一、在.Net代码中
(1)代码如下所示:
Console.Write("例1:"); Console.WriteLine("1 + " + '"' + "1" + '"'+" = ?"); int a = 1; Console.WriteLine("a = {0}", a); Console.WriteLine("a 的类型:{0}", a.GetType()); string b = "1"; Console.WriteLine("b = " + '"' + "1" + '"'); Console.WriteLine("b 的类型:{0}", b.GetType()); Console.WriteLine("a + b = {0}",a+b); Console.WriteLine("a + b 的类型:{0}", (a + b).GetType()); Console.WriteLine(); Console.WriteLine(); Console.Write("例2:"); Console.WriteLine("1 + '1' = ?"); Console.WriteLine("a = {0}", a); Console.WriteLine("a 的类型:{0}", a.GetType()); char c = '1'; Console.WriteLine("c = " + "'1'"); Console.WriteLine("c 的类型:{0}", c.GetType()); Console.WriteLine("a + c = {0}", a + c); Console.WriteLine("a + c 的类型:{0}", (a + c).GetType());
(2)运行结果:
(3)结论:
在.Net代码中
- int类型和string类型进行"+"操作,int类型会默认强制转换为string类型,所以最后的结果是两个string类型进行字符串的拼接,所以结果是"1"+"1"="11";
- int类型和char类型进行"+"操作,char类型会默认强制转换ASCII码对应的值(char类型'1'对应的ASCII码的值为49),且值为int类型,所以最后的结果是两个int类型进行字符串的相加,所以结果是1+49=50;
(4)附录一:ASCII码表
二、在JavaScript代码中
(1)代码如下所示:
<html> <head> <script> //例1:1 + "1" = ? var a = 1; var b = "1"; var result = a + b; alert(result); //例2:1 + '1' = ? var c = '1'; var result = a + c; alert(result); //例3:1 + 'a' = ? var c = 'a'; var result = a + c; alert(result); </script> <body> </body> </html>
(2)运行结果:
例1、例2运行结果都是11,如图1
图1
例3运行结果是1a,如图2
图2
图3
(3)结论:
在JavaScript代码中
- 根据图三可以判断,JavaScript没有char类型;
- int类型和string类型进行"+"操作,int类型会默认强制转换为string类型,所以最后的结果是两个string类型进行字符串的拼接,所以结果是"1"+"1"="11";
- 这种形式的'1'会被解析为string类型,所以1+'1'的结果和1+"1"的结果相同。
三、在SQLServer代码中
(1)代码如下所示:
----例1 --declare @a int --declare @b char --set @a=1 --set @b='1' --print '例1结果:' --print @a+@b --2 ----例2 --declare @c char --set @c='12' --print '例2结果:' --print @a+@c --2 ----例3 --declare @d char --set @d='d' --print '例3结果:' --print @a+@d --在将 varchar 值 'd' 转换成数据类型 int 时失败。 --例4 print '例4结果:' select 1+'1' as '例4结果' --例5 print '例5结果:' select 1+'12' as '例5结果'
(2)运行结果:
(3)结论:
在SQL Server代码中
- 没有string这种类型;
- 由例1、例2可以推出:int类型的变量和char类型进行"+"操作,char类型会默认强制转换第一个字符为int类型,后面的字符舍去,所以最后的结果是两个int类型进行字符串的相加,所以结果是1+'1'=2,1+'12'=2;
- 由例3可以推出,int类型的变量和char类型进行"+"操作,当char类型里面的值不是由0~9这几个数字组成时,将会报错:在将 varchar 值 'd' 转换成数据类型 int 时失败;
- 由例4、例5可以推出:用select查询时,int类型的变量和char类型进行"+"操作,char类型会默认强制转换int类型,所以最后的结果是两个int类型进行相加,所以查询出来的集合是1+'1'=2,1+'12'=13。
四、在PowerShell代码中
(1)代码如下所示:
#例1 1+'1'=? $a=1 $b='1' $a+$b #例2 1+'12'=? $a=1 $b='12' $a+$b #例3 1+"1"=? $a=1 $c="1" $a+$c #例3 1+"a"=? $a=1 $d="a" $a+$d
(2)运行结果:
(3)结论:
在PowerShell代码中
- 没有char类型,''和""是同一种标识字符串类型的标识符。
- int类型和string类型进行"+"操作,string类型会默认强制转换为int类型,所以最后的结果是两个int类型进行相加,所以结果是1+'1'=2,1+"1"=2,1+"12"=13;
五、还有更多的语言值得我们去探讨
如下图所示: