上一篇说的问题很简单,这次又深入一些了啊。首先我想分享下学习enum的经历。。
(1)
大家看哈,some.c前面没加int,直接给显示字符了,第二个就不一样了,所以大家以后用这个enum的时候一定要注意要么在enum后面直接注明类型,要么就别忘了这个转换。另外一个诡异的现象就是enum不能写在Main方法下,不然就出一些奇怪的错。查了一下才知道原来方法中不允许定义类/枚举/结构,不单Main方法不行,其他的方法也不行。
这些的定义必须放在namespaces或class等下面,涨知识了。
(2)还有就是大家很熟的switch,case结构,这本来没什么问题的,我还是找到一个不痛不痒的现象,就是goto语句竟然同样对default起作用,比如
这样不就可以把多种情况需要做同一处理的事件处理的很好吗?但是鉴于goto语句是个Semolina seed,祸乱的根源我们还是少碰为好。
(3)预处理真是程序员的福音啊,可以随意挑选自己的需要的代码运行,真正的一劳永逸啊。以下是简单的演示
#undef DEBUG
#define test
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int test = 2;
switch (test)
{
case 1:
Console.WriteLine("i am 1");
break;
case 2:
goto default;
case 3:
Console.WriteLine("i am 3");
break;
default:
Console.WriteLine("i am failed");
break;
}
#if DEBUG
Console.WriteLine("哈哈,我被执行了");
#endif
#if test
Console.WriteLine("哈哈,我被执行了啊");
#endif
}
}
}
undef的运行不了,代码是灰色的,但是有一天你想让它跑起来,只要把头上的undef改成define就行了,像是在程序的里面安了几个开关,想开几个灯就开几个。
(4)哦吼,前面的内容很简单啊,这会儿来点有难度的了,先来看看同一段代码在不同编译器的表现吧。
在C#里的
在c++里的
在java里的
可以看到C#的结果跟java是一样的,但是c++中的就不一样了。其实,在C#和java中一式是5+6+7,二式是6+7+8,而C++中是这么算的
第一步计算:(++i)+(++i)
优先括号,i=7, (++i)+(++i) == 7 + 7 == 14
第二步计算:14 + (++i)
j = 14 + 8 = 22
哈哈,知道这个了,想必各位看客老爷肯定知道二式在C++里咋算的吧?如果真不知道,评论我哦,我详解啊。
另外自己瞎想的时候脑洞一开,能不能把这类问题汇个总,弄个测试软件,到机器上一跑,通过结果不就能判断该机器是用什么编译器了吗,然后咱们就能弄出点好玩的东西……