求知若饥,虚心若愚
几个需要注意的操作符
- 空合并操作符 a::b,当a为空时返回b,支持短路和链式拼接
- 空条件操作符 a?.b, 非空判断,为空时短路。(数组取下标时也支持,a?[1], 但是这种写法只判断a是否为空,并不保证下标是否越界),特别适用于委托。
- 按位操作符,虽说可以用来乘除,但现代处理器对算数运算做了完美优化,除非是c那种古老的编译器,否则不要轻易用位运算来代替乘除,会造成迷惑。优先级也低于算数运算。
预处理器指令
- 排除和包含代码,#if-#elif-#endif,大多用于平台、版本、调试的判断
- 定义预处理器符号,#define, 使用#undef取消定义
- 生成错误和警告,#error #warning
- 关闭和还原警告,#pragma xx disable/restore xx
- nowarn:
,在编译器阶段可以去除警告 - 指定行号 #line,改变c#报告错误或警告时显示的行号,使用后记得用#line default还原
- 可视编辑器提示,#region #endregion,方便管理代码和代码查找
题外知识点,这一章课本用井字棋来讲解控制流程,其中用到了位操作符处理玩家操作,因为棋盘是有限格子,且每个格子是唯一,所以可以用不同的位来表示某个格子是否走过,然后按位或可以合并原先走过的旗子。将玩家走过的格子用一个数来表示,可以和获胜掩码进行比较,快速得知是否胜利。