
由Kernighan和Ritchie合著的经典教程《The C Programming Language》的开篇第一个C程序例子是打印简单的“hello world”。从此之后,“hello world”就成了描述一个人编写的第一个程序的代名词——不论是什么语言技术,即使实际上程序并没有在字样上输出“hello world”几个字。
对于初学者来说,这“hello world”程序是让人恐怖的。他会想“我一定非常笨,连这入门的hello world程序都觉得难。照这样下去,我一定不会喜欢上编程。”
其实,这问题的原因是我们把“第一个”和”最简单的一个“混淆了。“hello world”程序可以是任何的程序,没有难易限制。当你第一次编程时,你不知道该用哪种编译器、不知道代码文件应该放到哪里、不知道它们应该是什么格式, 等等。你需要去学。大量的知识在你真正能够编程前都需要学习、慢慢的学会 。
当我最初开始学习编程时,我总希望能尽快的越过写“hello world”程序的阶段,希望能够立刻开始编写真正有用的程序。但事实上,我发现我大半辈子时间都在写“hello world”程序,而且看不到结束的尽头。
每当讨论起“hello world”程序,几乎避免不了的要说一说这世界上最恐怖的“hello world”程序:Charles Petzold在他的《Programming Windows》一书中描述的第一个Windows程序。我只能找到这本书的Windows 98版的。不知道它跟最初的原版有多大区别,但我印象里原版里的代码会比现在这个更恐怖。
/*------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
英文原文:“Hello world” is the hard part
中文翻译:程序师网
引用来自“张亦俊”的评论
其实vs会生成9成代码引用来自“justjavac”的评论
vs只管生成,不管维护。引用来自“开源中国匿名会员”的评论
《Programming Windows》我还有这本书。还有一本叫 MFC 编程的,也是枕头书。
vs生成那些还是可以用的,细部调整要你弄而已。
引用来自“吃菜花的猪”的评论
中文名字叫<<windows程序设计>>, 另一本叫<<深入浅出MFC>>, 工作的前两年都啃过, 绝对的经典.引用来自“开源中国匿名会员”的评论
还有一本…… windows 游戏编程 ……引用来自“易天狼”的评论
我从来不学Microsoft的技术,就是因为很垃圾,简单的东西复杂化了,看看Qt做的多么具有艺术感,再看看垃圾MFC那乱七八糟的代码,一个函数好几个参数,一句话:恶心。引用来自“东胜神洲”的评论
无论如何恶心,这可是一家独大,别无分店。。那个年头,比 MFC 好的框架有的是,但是操作系统是 MS 的,操作系统底层 API 细节掌握在 MS 中,你要封装也要先得到 Win32 API 描述。只要微软最新的 Win32 API 迟个把月给你,你的产品就迟上市,当年的竞争就这么简单引用来自“易天狼”的评论
那是因为中国人都在用Windows,国外技术人员和学生都用MacOSX和Unix、Linux,现在大学还有MFC,不足为奇,你说的很对,Win32API影响国内很深引用来自“xesam”的评论
说得好像微软的程序员都是蠢货一样。感觉微软的垃圾封装让太多的细节变成了不通用的技术点,浪费了多少青春时光。
好不容易才从坑里跳出来。
引用来自“叶知泉”的评论
汇编的helloworld不是更恐怖、?引用来自“易天狼”的评论
我从来不学Microsoft的技术,就是因为很垃圾,简单的东西复杂化了,看看Qt做的多么具有艺术感,再看看垃圾MFC那乱七八糟的代码,一个函数好几个参数,一句话:恶心。引用来自“东胜神洲”的评论
无论如何恶心,这可是一家独大,别无分店。。那个年头,比 MFC 好的框架有的是,但是操作系统是 MS 的,操作系统底层 API 细节掌握在 MS 中,你要封装也要先得到 Win32 API 描述。只要微软最新的 Win32 API 迟个把月给你,你的产品就迟上市,当年的竞争就这么简单那时候可以整整一天搞不出一个正确的输出,或者程序跑阵子就吃内存到死机。。。
从生产力来说,java确实解放了几代人,swing 的窗口和组件new一下set点参数就出来了,当时觉得,爽爽爽,java就是好爽。
echo 'hello world';
引用来自“张亦俊”的评论
其实vs会生成9成代码引用来自“justjavac”的评论
vs只管生成,不管维护。引用来自“开源中国匿名会员”的评论
《Programming Windows》我还有这本书。还有一本叫 MFC 编程的,也是枕头书。
vs生成那些还是可以用的,细部调整要你弄而已。
引用来自“吃菜花的猪”的评论
中文名字叫<<windows程序设计>>, 另一本叫<<深入浅出MFC>>, 工作的前两年都啃过, 绝对的经典.引用来自“张亦俊”的评论
其实vs会生成9成代码引用来自“justjavac”的评论
vs只管生成,不管维护。引用来自“开源中国匿名会员”的评论
《Programming Windows》我还有这本书。还有一本叫 MFC 编程的,也是枕头书。
vs生成那些还是可以用的,细部调整要你弄而已。
引用来自“KB325688”的评论
尼妈,代码第一行 include 头文件都没有,不要跟我说尼妈能编译运行..我们都是程序员,不带这样忽悠的..引用来自“灰灰”的评论
是呀!要windows.h之类的吧!否则很多常量没有定义的,如窗口样式,消息之类的哈哈
引用来自“Force武装卫队”的评论
MessageBox几句就搞定了。引用来自“zhaojinhai”的评论
MessageBox是怎么工作的,你知道吗?引用来自“Force武装卫队”的评论
知道,还可以自己重写引用来自“zhaojinhai”的评论
即然知道,实现MessageBox的Hello World!其实也不是很容易.至少比文中的实例难.引用来自“KB325688”的评论
尼妈,代码第一行 include 头文件都没有,不要跟我说尼妈能编译运行..我们都是程序员,不带这样忽悠的..引用来自“Force武装卫队”的评论
MessageBox几句就搞定了。引用来自“zhaojinhai”的评论
MessageBox是怎么工作的,你知道吗?引用来自“Force武装卫队”的评论
知道,还可以自己重写引用来自“张亦俊”的评论
其实vs会生成9成代码引用来自“justjavac”的评论
vs只管生成,不管维护。引用来自“开源中国匿名会员”的评论
《Programming Windows》我还有这本书。还有一本叫 MFC 编程的,也是枕头书。
vs生成那些还是可以用的,细部调整要你弄而已。
引用来自“Force武装卫队”的评论
MessageBox几句就搞定了。引用来自“zhaojinhai”的评论
MessageBox是怎么工作的,你知道吗?引用来自“张亦俊”的评论
其实vs会生成9成代码引用来自“justjavac”的评论
vs只管生成,不管维护。还有一本叫 MFC 编程的,也是枕头书。
vs生成那些还是可以用的,细部调整要你弄而已。
引用来自“Force武装卫队”的评论
MessageBox几句就搞定了。引用来自“张亦俊”的评论
其实vs会生成9成代码