C# 本质论 第三章 操作符和控制流
操作符通常分为3大类:一元操作符(正、负)、二元操作符(加、减、乘、除、取余)和三元操作符( condition?consequence:alternative(consequence和alternative表达式类型要一致) ),它们对应的操作数分别是一个、两个和三个。
要是永远括号增加代码可读性。
要用符合格式化而不是加法操作符来拼接字符串。
可以用char类型相减求两字母距离。
float具有七位精度:
错误代码:
float n1 = 0.987654321;
正确代码:
float n = 0.987654321F; Console.WriteLine(n); //Displays: 0.9876543
float n = 987654321;//不加F也可以 Console.WriteLine(n); //Displays: 9.876543E+8
二进制浮点类型内部实际存储的是二进制分数而不是十进制分数。所以,分母不是2的整数次幂的小数无法用二进制浮点数准确表示。实际上,使用一个接近十六位float的,并且分母为2整数次幂的分数来表示。double十五位有效数字。
double n = 140.6F; Console.WriteLine(n); //Displays: 140.600006103516
避免在需要准确的十进制算术运算时使用二进制浮点类型,而使用decimal浮点型。
double n = 140.63435423524252315; Console.WriteLine(n); //Displays:140.634354235243 double n = 140.63435423524242315; Console.WriteLine(n); //Displays: 140.634354235242
所以,避免二进制浮点类型用于相等性条件式。要么判断两个值之差是否在容差范围之内,要么使用decimal类型。
float n = 0F; Console.WriteLine(n/0); //Displays: 非数字 Console.WriteLine(0/0); //报错:被常数零除 Console.WriteLine(0.0/0); //Displays: 非数字 Console.WriteLine(-1/0); //报错:被常数零除 Console.WriteLine(-1F/0); //Displays: 负无穷大 Console.WriteLine(1F/0); //Displays: 正无穷大
复合赋值操作符:
1 char current = 'z'; 2 int unicodeValue; 3 do 4 { 5 unicodeValue = current; 6 Console .Write("{0}={1}\t",current,unicodeValue); 7 current--; 8 } while (current>='a'); 9 Console.Read();
int count = 123; int result; result = count++; Console .Write("{0}\t{1}",result,count); Console.ReadLine(); //123 124
int count = 123; int result; result = ++count; Console .Write("{0}\t{1}",result,count); Console.ReadLine(); //124 124
前缀操作符的结果是变量递增递减之后的值,而后缀操作符的结果是变量递增递减之前的值。
不要用常量表示将来可能变化的任何值。
空接合操作符(??)如果之前都是null,则表示最后一个表达式。
x ?? y ?? z;
不要将移位操作符用作乘除法。
按位逻辑操作符:& | ^ 不进行“短路求值”:& |
按位赋值操作符:&= |= ^=
取反操作符(~)
控制流:
do/while类似于while循环,区别在于它至少会循环一次。
foreach循环:
foreach(type variable in collection) statement
不要使用continue作为跳转语句退出switch小节。
跳转语句:break。
预处理指令:在编译时调用
#region
#endregion