C语言基础教程 第一讲 变种 hello world

茵蒂克丝

  1. hello world 的日常
  2. printf 函数简介
  3. #define 宏定义字符串替换
  4. 宏定义编写中文C程序
  5. typedef 定义中文类型

常规的 hello world

新建项目

【文件】-> 【新建】 -> 【项目】 -> 【空项目】 -> 输入【项目名称】 -> 选择一个专门放代码的【文件夹】 -> 【确定】
按照上述步骤建好了一个空项目之后, 整个项目内应该是空荡荡的, 什么都没有. 这个时候我们找到【解决方案资源管理器】接着:

添加文件

【源文件】-> 【添加】 -> 【新建项】 -> 选择【C++文件】 -> 输入【名称】 -> 【确定】
需要注意的是, 生成C语言的 .c 文件需要输入的【名称】以 .c 结尾 如 hello.c

输入代码

#include <stdio.h>	// 引用 stdio 函数库 prnitf出处
#include <stdlib.h> // 引用 _sleep休眠函数出处

// 主函数 程序入口
int main()
{
	// 在屏幕上打印 hello world
	printf("hello world");
	// 程序休眠5秒
	_sleep(5000);
	// 函数结束, 返回0
	return 0;
}

printf 函数简介

出处:
作用: 基本输出函数, 将文字输出到屏幕上

函数原型:
int printf(const char *str, … );

将str所指向的字符串输出到屏幕上

占位符

所要输出的字符串中间可能有不确定的地方, 这个时候就需要用到占位符.占位符的意思是: 不知道要输出什么,具体要看后面的参数,只是这里先占个位置.
不过由于变量的类型不同,不知道要占多大的位置,所以占位符号要能表明其参数的类型.

常见占位符:

%d  十进制整数
%c  单个字符
%s  字符串
%f  小数

使用示例:

#include <stdio.h>	// for printf
#include <stdlib.h> // for _sleep

int main()
{
	printf("整数	: %d n", 233);
	printf("单个字符: %c n", 'A');
	printf("字符串	: %s n", "hello");
	printf("小数	: %f n", 3.14);

	_sleep(5000);	// 程序休眠5秒
	return 0;
}

PS: n 为【换行】的【转义字符】

#define 宏定义字符串替换

#define 学名宏定义。类似这种以 ‘#’ 井号开头的命令均为预处理指令。预处理的意思就是在编译之前预先处理。而单词 define 意思是【定义】,其作用就是定义一个【字符串替换】,用来代表名称学名叫做【宏】

使用方法:

#define 【宏名】 【替换字符串内容】

例如

#include <stdio.h>	// for printf
#include <stdlib.h> // for _sleep

// 定义了一个【宏】, 名称为 【PI】 其替换内容为 【3.14】
#define PI 3.14 	

int main()
{
	printf("PI 的值为	: %f n", PI); // 相当于使用 3.14
	// 圆面积公式 π 乘以 r的平方 
	printf("半径为2的圆面积为 : %f n", PI * 2 * 2); 
	_sleep(5000);
	return 0;
}

注意带小数的参数,对应 printf 占位符为 %f

宏定义编写中文C程序

#include <stdio.h> 	// 引用 printf 输出
#include <stdlib.h> // 引用 休眠函数

#define 主函数 main
#define 返回 return 
#define 打印 printf
#define 休眠 _sleep

整数 主函数()
{
	打印("你好, 世界!!");
	休眠(5000);
	返回 0;
}

中英文标点切换
请注意设置英文标点符号, 程序中不要出现中文标点符号
如:

休眠(5000);

是不行的, 请使用英文标点

休眠(5000);

主流的输入法都有设置【默认标点】的,各位可以自行设置,中英文之间可以使用【shift】键快捷切换。
注意,请使用visual studio 2008 以上版本

typedef 定义中文类型

属性 关键字
type 【类型】
define 【定义】

typedef 的意思就是【类型定义】

作用是定义某个类型的同义类型

例如:

typedef float money;

这样就定义了一个【float】类型的同义类型【money】类型该【money】类型本质上还是【float】类型,只不过名字换了一个

#include <stdio.h> // 引用printf
#include <stdlib.h> // 引用 休眠函数

#define 主函数 main
#define 返回 return 
#define 打印 printf
#define 休眠 _sleep

/* 定义中文类型 */
typedef int 整数;

整数 主函数()
{
	整数 i = 233;
	打印("你好, 世界  %d!!", i);
	休眠(5000);
	返回 0;
}

C语言 关键字

很常用的sizeof

sizeof 获取类型或变量所占空间大小

基本类型定义

void 空类型
char 字符类型
int 整数类型
short 短类型
long 长类型
float 小数类型(单精度)
double 小数类型(双精度)

类型自定义

struct 结构体
union 共同体
enum 枚举类型
typedef 定义类型同义字

不同的类型在不同的系统和不同的编译环境下所占空间大小不尽相同, 所以想要知道该类型所占空间大小请使用 sizeof 关键字
例如像查看 字符类型 所占空间大小可以:

printf("%d", sizeof(char) );// 查看 char 类型(字符类型) 所占空间大小

查看具体一个整数类型变量 所占空间大小可以:

int num = 10;				// 定义一个整数变量 num 并赋值为 10
printf("%d", sizeof(num) );	// 查看变量 num 所占空间大小

查看自定义类型所占的大小

// 定义一个结构体类型 student
struct student {
	char name[10]; 	// 自定义类型成员 name 数组
	int age;		// 自定义类型成员 age
};
printf("%d", sizeof(struct student) );	// 查看 struct student 类型所占空间大小

类型符号限定

signed (默认省略) 有符号变量,变量最高位用来做符号位,有正负值
unsigned 无符号变量,无正负值

内存状态修饰

auto (默认省略) 变量内存自动分配(函数结束会释放)
static 变量分配静态内存(函数结束不会释放)
const 声明常量,变量只读,除了初始化不能修改

流程控制

if 条件语句
else 条件语句否定分支(与 if 连用)
switch 根据随后的值来跳转
case switch的值等于case的值, 则执行case后的语句
default case条件都不满足时, 默认执行
for 一种循环语句
while 循环语句的循环条件
do 循环语句的循环体
goto 无条件跳转语句
break 结束当前循环
continue 结束该次循环, 进入循环的下一次

其它常用

extern 拓展声明,常用于在其它文件中引用变量
return 函数返回

不常用

register 声明寄存器变量
volatile 说明变量在程序执行中可被隐含地改变

centos 开放80端口

ping 也可以通,但是就不能http访问,
检查一下端口,发现80端口被那防火墙关了,没办法,只能开启此端口,

 vi /etc/sysconfig/iptables

请在:

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

这一句上面添加一句:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

然后重启防火墙

/etc/init.d/iptables restart

相关命令

 
# 查看防火墙的状态
/etc/init.d/iptables status
# 查看80 端口是否占用   
lsof -i tcp:80
# 查看已经连接的服务端口 (ESTABLISHED)  
netstat -a
# 查看所有的服务端口(LISTEN,ESTABLISHED)  
netstat -ap

CentOS 升级 python2.7

CentOS 很多自带的Python版本是2.4.3,但是目前许多基于Python的应用软件要求的Python版本应要高于2.4(如iotop、nodejs等要求Python版本至少是2.6以上)

wget -c http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
tar jxvf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure 
make && make install

自此,python2.7安装后路径默认是在/usr/local/lib/python2.7

#查看Python版本:
/usr/local/bin/python2.7 -V

建立软连接,使系统默认的python指向python2.7

mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python2.7 /usr/bin/python
#检验python指向是否成功
python -V  #查看默认python版本

由于yum是基于python2.4.3工作,这里要重新yum的调用

#vi /usr/bin/yum

将第一行显示的 “#/usr/bin/python” 修改为 “#/usr/bin/python2.4” 保存即可。

Sublime Text 2 编译和运行 Nodejs

这个简单,文章凑个数。
用 ST2 打开 js 文件。

选择:Tools -> Build System -> New Build System

然后输入:

{
	"cmd": ["node", "$file"]
}

保存为 NodeJs.sublime-build 然后在 Tools -> Build System 中选择刚刚添加的 NodeJs
接着我们的js随便写个hello

console.log("hello world");

通过 Tools -> Build (Ctrl+B) 来编译,我们来看看效果:

PS:如果编译无效果可以重启ST2再试一次

nodejs 安装 pomelo

如果是Windows系统,请确保你的Windows系统包含源码编译工具。Node.js的源码主要由C++代码和JavaScript代码构成,但是却用gyp工具来做源码的项目管理,该工具采用Python语言写成的。在Windows平台上,Node.js采用gyp来生成Visual Studio Solution文件,最终通过VC++的编译器将其编译为二进制文件。所以,在安装之前请确保你的Windows系统满足以下两个条件:

Python(2.5<version<3.0)。
VC++ 编译器,包含在Visual Studio 2010中(VC++ 2010 Express亦可)。
使用npm(node包管理工具)全局安装pomelo:

#如果是apt-get安装的node,需要单独安装g++,node的版本建议为0.8系列
npm install pomelo -g

可以通过命令git clone https://github.com/NetEase/pomelo.git下载源代码(如果你有git的话)。

好吧,上面是官方使用指南上的描述这里说下博主的曲折安装经历

windows xp

首先是博主在 xp操作系统 的安装情况,先是最开始的安装的时候没反应然后琢磨了一整子之后先装了 socket.io 然后再执行:

npm install pomelo -g

居然就装好了,太顺利了反而有些不习惯,安装好了之后通过运行 “–help” 查看一下帮助

E:node>pomelo --help

  Usage: pomelo [action] [option]

  Options:
  init  [path]        create new application
  start [option]      start the application
  list                list server information
  stop                stop the application
  kill  [--force]     kill the application
  --version             output framework version
  --help                output help information
  [option]            developement(default)/production --daemon

windows 7 x64

xp上皆大欢喜的样子,接下来就要说博主苦逼的 win7 64位 安装史了

npm install pomelo

先是执行安装的时候很快就一片红,接着博主按照 xp 上的老路先去安装 socket.io 然后在执行一遍install,结果报错少了很多,却出现了一个新错误:
pomelo社区上的报错示意图,没看见也没关系
错误内容:fatal error C1083: 无法打开包括文件:“v8.h”: No such file or directory

研究好一阵子,最后的解决方案是 Python 2.7 重新默认安装(win7电脑上没默认安装),node从原本的 v0.10.13 刷成了 v0.8.9 而且是32位的 (据说是0.10.x上不支持 v8-profiler 的原因)。随后博主继续执行 install,然后时不时通过 npm list 来查看模块列表中是不是出现了 pomelo,有的时候碰到心急的也用上述 socket.io 安装过程中的办法手动装过几个依赖,总之一阵鸡飞狗跳之后在 npm list 上终于找到 pomelo 的身影。

于是各位以为终于装好了?其实我也以为我装好了,但是我一运行却发现:

E:node>pomelo
'pomelo' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

如果你安装好了,那么恭喜你。如果出现了同博主一样的问题也不用着急。
这个问题倒是让博主反复的重装了几遍最后执行 install pomelo 的时候都只有寥寥几个 http 请求(这意味着依赖模块都已安装好了),于是我变换了战略开始翻起了 node_modules 文件夹。

通过观察 node_modules/pomelo 下的 Makefile 发现 pomelo 安装最后生成的文件是保存在 /node_modules/.bin/ 目录下,接着到 /node_modules/.bin/ 目录下发现了 pomelo 和 pomelo.cmd 这两个文件,再具体就不说了,总之最后的结论就是:

E:node>pomelo --help
'pomelo --help' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

上述方式不行的话,这样就可以了:

E:node>node E:nodenode_modulespomelobinpomelo --help

  Usage: pomelo [action] [option]

  Options:
  init  [path]        create new application
  start [option]      start the application
  list                list server information
  stop                stop the application
  kill  [--force]     kill the application
  --version             output framework version
  --help                output help information
  [option]            developement(default)/production --daemon

用全路径,虽然麻烦了一点,但是好歹可以用了,像初始化命令的话就这样吧

E:node>node E:nodenode_modulespomelobinpomelo init E:nodepomelo_demo

觉得麻烦的话也可以自己写个exe,然后添加到 path 来省略那一串路径(以前的程序员倒是挺喜欢做这种事情的)。

官方环境测试全文:game server test
对了,顺便提一句,博主运行官方的测试例子貌似用IE8没反应,换了 firefox 才弹出来一个 ok 的提示。

nodejs 安装 socket.io

前置条件:
确保安装 python 2.7 (默认目录)
确保安装 visual stduio 2008 或以上 (博主是 visual studio 2010)

其他信息:
博主测试系统:xp、win7 x64
node 版本:v0.10.13

开始安装:
最开始的时候照着socket.io官网上的方法就直接

npm install socket.io

运行之后没有报错,也没有什么提示,拿着官网上的例子运行结果还报错说模块未找到,各种汗颜。

npm list

运行查看了一下,也发现没有安装任何包。然后仔细研究了安装的信息半天最后把目光聚焦在安装时最后出现的信息上:

├── base64id@0.1.0
├── policyfile@0.0.4
├── redis@0.7.3
└── socket.io-client@0.9.16 (xmlhttprequest@1.4.2, uglify-js@1.2.5, active-x-obfuscator@0.0.1, ws@0.4.27)

琢磨一会,看到上面有个 @ + 版本号,就弱弱的在想这个莫不是缺少的依赖项,然后就尝试了一下,结果安装成功了。

npm install base64id@0.1.0
npm install policyfile@0.0.4
npm install redis@0.7.3
npm install socket.io-client@0.9.16
npm install xmlhttprequest@1.4.2
npm install uglify-js@1.2.5
npm install active-x-obfuscator@0.0.1
npm install ws@0.4.27
npm install tinycolor@0.0.1
npm install options@0.0.5
npm install commander@0.6.1
npm install ws@0.4.27
npm install ws@0.4.27
npm install socket.io
npm list

以上是博主中间碰到的可能会依赖到的包,各位可以直接复制然后在cmd上粘贴即可。

好吧,研究了一阵子之后发现貌似不是要手动安装挨个依赖包的问题,而是最开始的时候不记得在哪里看到的用的是

npm install -g socket.io
npm list     # 查找不到的原因是因为全局安装
npm list -g  # 这样才能查看到全局的模块

结果本地测试就不行,说找不到模块

npm install socket.io

这样本地就能找到模块了,npm有自带的查找依赖包然后安装的功能,上面的就留个纪念放在这里了。