Question: 关于 free() 的参数问题

引用 9 楼 test_lockxxx 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  赵老师，请问：  char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放pstr指向的内存吗？[/quote] 能

4.10.3.2 The free function   Synopsis           #include <stdlib.h>          void free(void *ptr);  Description     The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation.  If ptr is a null pointer, no action occurs.  Otherwise, if the argument does not match a pointer earlier returned by the calloc , malloc , or realloc function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

// 由于 abc指针 进行了移动,  free(abc) 还能把上面申请的 16个字节的内存释放吗？ 还是释放 13 个字节？ 不是释放16个字节，也不是释放13个字节，因为free(abc)直接执行错误  为啥呢？ 可以起看看malloc的源码 是因为malloc申请内存传递一个大小的参数得到一个指针，此时已经记录了指针和大小，当你释放的时候，就会去找这个指针，而你移动了指针，所以就找不到就直接报错了

引用 11 楼 my_live_123 的回复:[quote=引用 10 楼 sholber 的回复:] [quote=引用 7 楼 my_live_123 的回复:] 很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？[/quote] 这和malloc实现有关系，如果一个不错的实现，那么它返回的一定是“适当”对齐的，这个适当就必须满足各种数据对象.且还要满足操作系统的对齐要求。如果操作系统指定所有数据对象都是4字节或者8字节对齐，那么malloc返回的必须是这样对齐的地址，否则就是error！ 此外，有的malloc实现，分配的大小要大于等于你的参数。比如你给一个奇数参数，它不会正正好好就给你那么多！它会分配一个能满足你大小但是要大于你给定的大小的一段连续空间，一般都是某个数的倍数。[/quote]  这和OS没关系，和架构有关。 C的实现只需使用那个最严格的对齐要求即可。 俺让楼主给你满分。

引用 10 楼 sholber 的回复:[quote=引用 7 楼 my_live_123 的回复:] 很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？[/quote] 这和malloc实现有关系，如果一个不错的实现，那么它返回的一定是“适当”对齐的，这个适当就必须满足各种数据对象.且还要满足操作系统的对齐要求。如果操作系统指定所有数据对象都是4字节或者8字节对齐，那么malloc返回的必须是这样对齐的地址，否则就是error！ 此外，有的malloc实现，分配的大小要大于等于你的参数。比如你给一个奇数参数，它不会正正好好就给你那么多！它会分配一个能满足你大小但是要大于你给定的大小的一段连续空间，一般都是某个数的倍数。

引用 7 楼 my_live_123 的回复:很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？

引用 5 楼 zhao4zhong1 的回复:free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  赵老师，请问：  char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放pstr指向的内存吗？

引用 2 楼 test_lockxxx 的回复:char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放内存吗？  不能, 没释放

free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  free <stdlib.h> and <malloc.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  memblock  Previously allocated memory block to be freed  Remarks  The free function deallocates a memory block (memblock) that was previously allocated by a call to calloc, malloc, or realloc. The number of freed bytes is equivalent to the number of bytes requested when the block was allocated (or reallocated, in the case of realloc). If memblock is NULL, the pointer is ignored and free immediately returns. Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.  After a memory block has been freed, _heapmin minimizes the amount of free memory on the heap by coalescing the unused regions and releasing them back to the operating system. Freed memory that is not released to the operating system is restored to the free pool and is available for allocation again.  When the application is linked with a debug version of the C run-time libraries, free resolves to _free_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* MALLOC.C: This program allocates memory with  * malloc, then frees the memory with free.  */  #include <stdlib.h>         /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h>  void main( void ) {    char *string;     /* Allocate space for a path name */    string = malloc( _MAX_PATH );    if( string == NULL )       printf( "Insufficient memory available\n" );    else    {       printf( "Memory space allocated for path name\n" );       free( string );       printf( "Memory freed\n" );    } }   Output  Memory space allocated for path name Memory freed   Memory Allocation Routines  See Also   _alloca, calloc, malloc, realloc, _free_dbg, _heapmin

内存管理器一般是这么记录每个内存块的， （首地址，长度） （首地址，长度） （首地址，长度） （首地址，长度） （首地址，长度） 如果你没有给它传首地址，一般情况下它是认为你传的是个无效地址，不会有内存释放动作的。它在管理内存的时候，是按块管理的，不存在只删除一部分的情形。  参考 http://www.afanihao.cn/c_guide/  的第12章“动态内存分配”

引用 2 楼 test_lockxxx 的回复:char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放内存吗？ 能

这就是不对. 不能这么用


Question: 帮人找一道C语言，fork()函数编程题目

引用 3 楼 my_live_123 的回复:1.创建了一个子进程，使用的系统调用fork() 2.使用了wait()和_exit（）系统调用。wait等待子进程的执行完毕，并获取其终结信息，传递的NULL参数，显然不关心子进程的终止信息。_exit（）由ISO的exit()调用，负责正常终止进程的执行    引用 2 楼 youismyo2 的回复:主要是第一二小题不知道怎么答 +1  第三题： before fork. global = 7, local = 8 end fork. global = 6, local = 7 end fork.

before fork. gobal = [7] local = [8]  end fork gobal = [6] local = [7] end fork  调用了fork() 创建了一个子进程, 创建子进程后,子进程拥有了一份父进程的副本,所以这个时候 ++ 操作不影响.  对于全局变量gobal, 它们 有共同的地址,但是值不一样...     上面 只是我自己的理解..

主要是第一二小题不知道怎么答


Question: %f的问题

引用 3 楼 q849179433 的回复:[quote=引用 1 楼 pathletboy 的回复:] #include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0[/quote]  不是0啊 http://ideone.com/Ha6Rbd

10/3结果为3 % f为浮点型  都不是同一个类型如果想要浮点型可以强制类型转换

引用 4 楼 pathletboy 的回复:[quote=引用 3 楼 q849179433 的回复:] [quote=引用 1 楼 pathletboy 的回复:] #include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0[/quote]  不是0啊 http://ideone.com/Ha6Rbd[/quote] %f会从栈上取8字节，10/3只push进去4字节，所以出啥结果都不奇怪。

这个结果是3.333333，你的编译器有问题吧。

引用 1 楼 pathletboy 的回复:#include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0

引用 1 楼 pathletboy 的回复:#include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。这个是为什么呢


Question: c语言映射

明白了各位，谢谢大家亲情帮助，回帖有点晚是因为我以为这个帖子会沉

引用 6 楼 sholber 的回复:[quote=引用 5 楼 my_live_123 的回复:] [quote=引用 4 楼 sholber 的回复:] [quote=引用 1 楼 iamshaofa 的回复:] int      index =  'C' - 'A' ;  参考 http://www.afanihao.cn/c_guide/  第5章 引用 3 楼 fly_dragon_fly 的回复:查表 比如 int a[]={3,3,3}; 用时 a['C'-'A']  这是不具有通用性的，换句话说，它是不可移植的。 C也没有规定必须使用ASCII做为字符集，选择什么字符集，取决于C的实现。而且，C并没有规定英文字母在字符集中必须是连续的，只规定0~9这十个数字必须连续。在有些字符集中，字符并不是连续编排的，典型地，在EBCDIC字符集中，英文字母就不是连续编排的。  实在是不明白楼主的意思，赵老湿你明白了？ enum e {A = 3, B = 3, C = 3,};[/quote]  给你一个黑盒，当你把字符输入时，输出一个固定的数值，太神奇了！如此神奇，咱讨论下怎么称呼它吧 ——这个黑盒 用计算机术语讲叫映射表/处理器； 用数学术语讲叫函数； 用自动化术语叫生产车间； 用通信术语叫变换； 用生物学术语叫代谢主体； 用金融术语叫投入产出比； 用考古学术语叫推演； 用天文学术语叫模拟； ... [/quote] 哟西~嘎嘎~~ 我认为黑盒类似于厕所。你懂的。 那干哈不用 if (chr = 'C') return 3; 你看没看电影《The Imitation Game》，讲图灵的。  幕后花絮   编辑 在2011年好莱坞业内评出的未拍摄最优秀剧本黑名单（Black List）上，《模仿游戏》排名第一。 《模仿游戏》是莫腾·泰杜姆执导的的首部英语电影[13] 。 韦恩斯坦公司为了获得本片在北美的发行权支付了700万美元，这是有史以来美国制片公司在欧洲电影市场上开出的最高价码。 由于入戏太深，在拍摄影片的最后几场戏时，本尼迪克特·康伯巴奇无法抑制自己的颤抖和哭泣。 康伯巴奇与艾伦·图灵的家族现实中有血亲关系，但要追溯到14世纪，他们是第17代表亲。同时，康伯巴奇本科毕业于曼彻斯特大学，而图灵恰巧曾担任曼大计算机实验室副主任[14] 。 英国首相丘吉尔曾表示二战取得胜利最应该感谢的人就是图灵。 康伯巴奇谈到2013年图灵获英女王“皇家赦免”一事。他认为，唯一有资格赦免任何的人是图灵自己，希望这部电影能让人意识到他的伟大，及他所遭遇迫害的恐怖，这是一段耻辱的历史。 马修·古迪这样描述影片的内容，它聚焦于图灵的人生以及英国人是如何用阉割他的方式来颂扬他在战争中做出的伟大贡献。 图灵有口吃，直到4岁才被养父母收养，上学之后口吃更严重。在那段日子里，任何一个需要正常社交的地方，图灵都因为口吃而倍受困扰[15] 。 莱昂纳多·迪卡普里奥最初有望在片中饰演图灵。 电影于2013年11月11日关机，这一天恰好是阵亡将士纪念日。 电影2014年11月14日英国上映，而74年前的11月14日德军轰炸了考文垂。传闻当时布莱切利园的破译专家已经破解了这次行动，但未公之于众，为的是不让德国人知道Enigma密码已被破译。 片中见到的图灵机“Christopher”是一件复制品，真实的图灵机被安置在布莱切利园。复制品比起原件体积更大，更适合在电影中展现内部机器部件。 由于英国道路管理法的限制，片中伦敦被空袭一场戏必须在星期日拍摄。等到拍摄准备就绪后，美术部门的人才想起忘了准备瓦砾道具。 片中，凯拉·奈特莉将“Euler”这个名字发音为“Euler”，但是事实上它在德语中的正确发音应该为“Oiler”。 亚历山大·迪斯普拉特在三个星期之内为影片创作出了原声。原声由伦敦交响乐团演奏，在艾比路录音室录制  [/quote]  没有，改天瞅瞅，看过书《图灵传》

引用 5 楼 my_live_123 的回复:[quote=引用 4 楼 sholber 的回复:] [quote=引用 1 楼 iamshaofa 的回复:] int      index =  'C' - 'A' ;  参考 http://www.afanihao.cn/c_guide/  第5章 引用 3 楼 fly_dragon_fly 的回复:查表 比如 int a[]={3,3,3}; 用时 a['C'-'A']  这是不具有通用性的，换句话说，它是不可移植的。 C也没有规定必须使用ASCII做为字符集，选择什么字符集，取决于C的实现。而且，C并没有规定英文字母在字符集中必须是连续的，只规定0~9这十个数字必须连续。在有些字符集中，字符并不是连续编排的，典型地，在EBCDIC字符集中，英文字母就不是连续编排的。  实在是不明白楼主的意思，赵老湿你明白了？ enum e {A = 3, B = 3, C = 3,};[/quote]  给你一个黑盒，当你把字符输入时，输出一个固定的数值，太神奇了！如此神奇，咱讨论下怎么称呼它吧 ——这个黑盒 用计算机术语讲叫映射表/处理器； 用数学术语讲叫函数； 用自动化术语叫生产车间； 用通信术语叫变换； 用生物学术语叫代谢主体； 用金融术语叫投入产出比； 用考古学术语叫推演； 用天文学术语叫模拟； ... [/quote] 哟西~嘎嘎~~ 我认为黑盒类似于厕所。你懂的。 那干哈不用 if (chr = 'C') return 3; 你看没看电影《The Imitation Game》，讲图灵的。  幕后花絮   编辑 在2011年好莱坞业内评出的未拍摄最优秀剧本黑名单（Black List）上，《模仿游戏》排名第一。 《模仿游戏》是莫腾·泰杜姆执导的的首部英语电影[13] 。 韦恩斯坦公司为了获得本片在北美的发行权支付了700万美元，这是有史以来美国制片公司在欧洲电影市场上开出的最高价码。 由于入戏太深，在拍摄影片的最后几场戏时，本尼迪克特·康伯巴奇无法抑制自己的颤抖和哭泣。 康伯巴奇与艾伦·图灵的家族现实中有血亲关系，但要追溯到14世纪，他们是第17代表亲。同时，康伯巴奇本科毕业于曼彻斯特大学，而图灵恰巧曾担任曼大计算机实验室副主任[14] 。 英国首相丘吉尔曾表示二战取得胜利最应该感谢的人就是图灵。 康伯巴奇谈到2013年图灵获英女王“皇家赦免”一事。他认为，唯一有资格赦免任何的人是图灵自己，希望这部电影能让人意识到他的伟大，及他所遭遇迫害的恐怖，这是一段耻辱的历史。 马修·古迪这样描述影片的内容，它聚焦于图灵的人生以及英国人是如何用阉割他的方式来颂扬他在战争中做出的伟大贡献。 图灵有口吃，直到4岁才被养父母收养，上学之后口吃更严重。在那段日子里，任何一个需要正常社交的地方，图灵都因为口吃而倍受困扰[15] 。 莱昂纳多·迪卡普里奥最初有望在片中饰演图灵。 电影于2013年11月11日关机，这一天恰好是阵亡将士纪念日。 电影2014年11月14日英国上映，而74年前的11月14日德军轰炸了考文垂。传闻当时布莱切利园的破译专家已经破解了这次行动，但未公之于众，为的是不让德国人知道Enigma密码已被破译。 片中见到的图灵机“Christopher”是一件复制品，真实的图灵机被安置在布莱切利园。复制品比起原件体积更大，更适合在电影中展现内部机器部件。 由于英国道路管理法的限制，片中伦敦被空袭一场戏必须在星期日拍摄。等到拍摄准备就绪后，美术部门的人才想起忘了准备瓦砾道具。 片中，凯拉·奈特莉将“Euler”这个名字发音为“Euler”，但是事实上它在德语中的正确发音应该为“Oiler”。 亚历山大·迪斯普拉特在三个星期之内为影片创作出了原声。原声由伦敦交响乐团演奏，在艾比路录音室录制

引用 4 楼 sholber 的回复:[quote=引用 1 楼 iamshaofa 的回复:] int      index =  'C' - 'A' ;  参考 http://www.afanihao.cn/c_guide/  第5章 引用 3 楼 fly_dragon_fly 的回复:查表 比如 int a[]={3,3,3}; 用时 a['C'-'A']  这是不具有通用性的，换句话说，它是不可移植的。 C也没有规定必须使用ASCII做为字符集，选择什么字符集，取决于C的实现。而且，C并没有规定英文字母在字符集中必须是连续的，只规定0~9这十个数字必须连续。在有些字符集中，字符并不是连续编排的，典型地，在EBCDIC字符集中，英文字母就不是连续编排的。  实在是不明白楼主的意思，赵老湿你明白了？ enum e {A = 3, B = 3, C = 3,};[/quote]  给你一个黑盒，当你把字符输入时，输出一个固定的数值，太神奇了！如此神奇，咱讨论下怎么称呼它吧 ——这个黑盒 用计算机术语讲叫映射表/处理器； 用数学术语讲叫函数； 用自动化术语叫生产车间； 用通信术语叫变换； 用生物学术语叫代谢主体； 用金融术语叫投入产出比； 用考古学术语叫推演； 用天文学术语叫模拟； ...

引用 1 楼 iamshaofa 的回复:int      index =  'C' - 'A' ;  参考 http://www.afanihao.cn/c_guide/  第5章 引用 3 楼 fly_dragon_fly 的回复:查表 比如 int a[]={3,3,3}; 用时 a['C'-'A']  这是不具有通用性的，换句话说，它是不可移植的。 C也没有规定必须使用ASCII做为字符集，选择什么字符集，取决于C的实现。而且，C并没有规定英文字母在字符集中必须是连续的，只规定0~9这十个数字必须连续。在有些字符集中，字符并不是连续编排的，典型地，在EBCDIC字符集中，英文字母就不是连续编排的。  实在是不明白楼主的意思，赵老湿你明白了？ enum e {A = 3, B = 3, C = 3,};

查表 比如 int a[]={3,3,3}; 用时 a['C'-'A']


Question: linux c 标准预处理宏 文档哪里可以看到？

引用 14 楼 yangyunzhao 的回复:预处理宏是编译器提供的，还是语言标准规定？ 都是，又都不是。 有的编译器提供，有的编译器不提供。 有的语言标准规定，有的语言标准未规定。

预处理宏是编译器提供的，还是语言标准规定？

引用 9 楼 sodino 的回复:[quote=引用 8 楼 my_live_123 的回复:] ISO C99 MSDN  msdn得win机子，暂时没有， ISO c99是什么意思呢？怎么查阅？[/quote] C语言标准

引用 11 楼 Beinggeeks 的回复:  灌水吗？求留干货指导呀..

引用 8 楼 my_live_123 的回复:ISO C99 MSDN  msdn得win机子，暂时没有， ISO c99是什么意思呢？怎么查阅？

直接看标准文档和编译器文档不就行了嘛，最直接最全面。 ------ 老池~你这么大声，邻居会告我们的~~ 我还怕他们告哇， 他们告个屁呀， 我是律师~~~ 我们是律师~~~

ISO C99 MSDN

引用 1 楼 zmlovelx 的回复:https://linux.web.cern.ch/linux/scientific4/docs/rhel-cpp-en-4/predefined-macros.html  感谢

引用 2 楼 sholber 的回复:直接看标准文档和编译器文档不就行了嘛，最直接最全面。  问的就是在哪里能查看呢？你也没说...

引用 4 楼 zhao4zhong1 的回复:查MSDN是Windows程序员必须掌握的技能之一。 。。。  额，win有msdn，mac下怎么办？

查MSDN是Windows程序员必须掌握的技能之一。 Predefined Macros The compiler recognizes six predefined ANSI C macros (see Table 1.1), and the Microsoft C++ implementation provides several more (see Table 1.2). These macros take no arguments and cannot be redefined. Their value (except for __LINE__ and __FILE__) must be constant throughout compilation. Some of the predefined macros listed below are defined with multiple values. Their values can be set by selecting the corresponding menu option in the Visual C++ development environment, or by using a command-line switch. See the tables below for more information.  Table 1.1   ANSI Predefined Macros  Macro Description  __DATE__ The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H.   __FILE__ The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks.   __LINE__ The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive.   __STDC__ Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined.   __TIME__ The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss.   __TIMESTAMP__ The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31.       Table 1.2   Microsoft-Specific Predefined Macros   Macro Description  _CHAR_UNSIGNED Default char type is unsigned. Defined when /J is specified.   __cplusplus Defined for C++ programs only.  _CPPRTTI Defined for code compiled with /GR (Enable Run-Time Type Information).  _CPPUNWIND Defined for code compiled with /GX (Enable Exception Handling).  _DLL Defined when /MD or /MDd (Multithread DLL) is specified.  _M_ALPHA Defined for DEC ALPHA platforms. It is defined as 1 by the ALPHA compiler, and it is not defined if another compiler is used.  _M_IX86 Defined for x86 processors. See Table 1.3 for more details.  _M_MPPC Defined for Power Macintosh platforms. Default is 601 (/QP601). See Table 1.4 for more details.  _M_MRX000 Defined for MIPS platforms. Default is 4000 (/QMR4000). See Table 1.5 for more details.  _M_PPC Defined for PowerPC platforms. Default is 604 (/QP604). See Table 1.6 for more details.  _MFC_VER Defines the MFC version. Defined as 0x0421 for Microsoft Foundation Class Library 4.21. Always defined.  _MSC_EXTENSIONS This macro is defined when compiling with the /Ze compiler option (the default).  Its value, when defined, is 1.  _MSC_VER Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined.  _MT Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified.   _WIN32 Defined for applications for Win32®. Always defined.     As shown in following tables, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified.  Table 1.3   Values for _M_IX86  Option in Developer Studio Command-Line Option Resulting Value  Blend /GB _M_IX86 = 500 (Default. Future compilers will emit a different value to reflect the dominant processor.)  Pentium /G5 _M_IX86 = 500  Pentium Pro /G6 _M_IX86 = 600  80386 /G3 _M_IX86 = 300  80486 /G4 _M_IX86 = 400       Table 1.4   Values for _M_MPPC  Option in development environment Command-Line Option Resulting Value  PowerPC 601 /QP601 _M_MPPC = 601 (Default)  PowerPC 603 /QP603 _M_MPPC = 603  PowerPC 604 /QP604 _M_MPPC = 604  PowerPC 620 /QP620 _M_MPPC = 620       Table 1.5   Values for _M_MRX000  Option in Developer Studio Command-Line Option Resulting Value  R4000 /QMR4000 _M_MRX000 = 4000 (Default)  R4100 /QMR4100 _M_MRX000 = 4100  R4200 /QMR4200 _M_MRX000 = 4200  R4400 /QMR4400 _M_MRX000 = 4400  R4600 /QMR4600 _M_MRX000 = 4600  R10000 /QMR10000 _M_MRX000 = 10000       Table 1.6   Values for _M_PPC  Option in Developer Studio Command-Line Option Resulting Value  PowerPC 601 /QP601 _M_PPC = 601  PowerPC 603 /QP603 _M_PPC = 603  PowerPC 604 /QP604 _M_PPC = 604 (Default)  PowerPC 620 /QP620 _M_PPC = 620


Question: C与指针这本书的问题

参考  http://www.afanihao.cn/c_guide/   第12章


Question: 一个linux大牛说： paste  -d 分隔符的使用，最好用单引号，

up 起来，有高手不？

cp 1+2 3 难道不是linux命令？ 我的意思就是提醒你，加号在命令行中使用有特殊功能，要屏蔽此特殊功能，就有必要用单引号括住它了。

引用 2 楼 zhao4zhong1 的回复:因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。  还有，我这是 linux命令，

引用 2 楼 zhao4zhong1 的回复:因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。   如果没有假的话，会如何？

因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。


Question: POJ 1001 求高精度幂 ，样例通过，但是还是WA，怎么办？求大神帮助。

还是没有搞定求助！！！

#include <stdio.h> #include <stdlib.h>  void Init(int s[250]);//初始化数组，使空位为10 void LongMul(int s1[250],int s2[250],int ans[250]);//超长整数乘法 void PrintLN(int s[250],int p);//输出结果  int main() {     int i,j,n,m,t,x;     int temp1[250],temp2[250];     char str[6];     struct decimal{         int s[250];         int p;//小数点位置         int d;     }data[100];     for(n=0;scanf("%s%d",str,&data[n].d)==2;n++){         for(m=0;str[m]!='.';m++)//确定输入值小数点位置             ;         data[n].p=(5-m)*data[n].d;//计算完成后小数点位置         Init(data[n].s);         for(i=0;str[i]!='.';i++)//将输入值小数点前后的数字复制到可计算的int数组内             data[n].s[i]=str[i]-'0';         for(;i<5;i++)             data[n].s[i]=str[i+1]-'0';         for(m=0;m<2;m++){//翻转数组             t=data[n].s[m];             data[n].s[m]=data[n].s[4-m];             data[n].s[4-m]=t;         }     }     for(i=0;i<n;i++){         Init(temp1);         Init(temp2);         LongMul(data[i].s,data[i].s,temp1);         for(j=0;j<(data[i].d-2);j++){//进行幂运算             LongMul(data[i].s,temp1,temp2);             for(m=0;temp2[m]!=10;m++)                 temp1[m]=temp2[m];             x=0;         }         PrintLN(temp1,data[i].p);//输出数值         if(i<n-1)             printf("\n");     }     return 0; }  void Init(int s[250]) {     int i;     for(i=0;i<250;i++)         s[i]=10; }  void LongMul(int s1[250],int s2[250],int ans[250]) {     int i,j,n,m,t;     int t1[250],t2[250],t3[250];     Init(t1);     Init(t2);     Init(t3);     t1[0]=s1[0]*s2[0]%10;//s1和s2的个位相乘     if(s1[0]*s2[0]>=10)         t=(s1[0]*s2[0]-s1[0]*s2[0]%10)/10;     else         t=0;     for(j=1;s2[j]!=10;j++){//s1的个位和s2整体相乘         t1[j]=(s1[0]*s2[j]+t)%10;         if(s1[0]*s2[j]+t>=10)             t=((s1[0]*s2[j]+t)-(s1[0]*s2[j]+t)%10)/10;         else             t=0;//当无须进位时，t归零     }     if(t!=0)//如果s1个位与s2最高位相乘大于10则进位，记录于t1         t1[j]=t;     for(i=1,m=1,t=0;s1[i]!=10;i++,m++,t=0){//s1和s2整体相乘，s1应短于s2         t2[0]=s1[i]*s2[0]%10;//s1的i位和s2的个位相乘         if(s1[i]*s2[0]>=10)//控制进位             t=(s1[i]*s2[0]-s1[i]*s2[0]%10)/10;         for(j=1;s2[j]!=10;j++){//s1的i位（此处大循环中不变）和s2的j位逐步相乘，得到t2             t2[j]=(s1[i]*s2[j]+t)%10;             if(s1[i]*s2[j]+t>=10)//控制进位                 t=((s1[i]*s2[j]+t)-(s1[i]*s2[j]+t)%10)/10;             else                 t=0;//当无须进位时，t归零         }         if(t!=0)//当到达最高位时，使最高位等于所进位数             t2[j]=t;         t3[0]=t1[0];//填补t3的1位（需要手动）         if(t1[m]+t2[0]<10){//t1的m位和t2的m位相加，得到t3的m位             t=0;             t3[m]=t1[m]+t2[0];         }         else{             t=((t1[m]+t2[0])-(t1[m]+t2[0])%10)/10;             t3[m]=(t1[m]+t2[0])%10;         }         for(n=1;t1[n+m]!=10;n++){//t1和t2从m+1位开始，逐位相加             t3[n+m]=(t1[n+m]+t2[n]+t)%10;             if(t1[n+m]+t2[n]+t>=10)//控制进位                 t=((t1[n+m]+t2[n]+t)-(t1[n+m]+t2[n]+t)%10)/10;             else                 t=0;         }         if(t1[n+m]==10&&t2[n]!=10){//当t2位数比t1长时，将t2的超出位填补入t3的高位             for(;t2[n]!=10;n++){                 t3[n+m]=(t2[n]+t)%10;                 t=((t2[n]+t)-(t2[n]+t)%10)/10;             }             if(t==1){//当t2比t1的和比t2长时进一位                 t3[n+m]=1;             }             if(t3[n+m]==0)                 t3[n+m]=10;         }         else if(t1[n+m]==10&&t2[n]==10&&t!=0)             t3[n+m]=t;         for(n=0;t3[n]!=10;n++)//将临时储存数组t3复制给t1             t1[n]=t3[n];         Init(t2);     }     for(n=0;t3[n]!=10;n++)//将最后的结果t3传递给ans作为输出         ans[n]=t3[n]; }  void PrintLN(int s[250],int p) {     int i,n,m;     for(n=0;s[n]!=10;n++)//指针到达结果的最高位（从最高位输出）         ;     for(m=0;s[m]==0&&m!=p;m++)//记录真实数值的末尾有几个零         ;     if(s[n-1]==0)//去除真实数值最高位的零         n--;     for(i=n-1;i>=p;i--)//输出至小数点处         printf("%d",s[i]);     if(p==m)//输出小数点         ;     else         printf(".");     for(;i>=m;i--)//输出小数点后的数         printf("%d",s[i]); }

发全了……但是被吞了。点击查看源代码就可以了。

代码发全。。

求帮助˃̣̣̥᷄⌓˂̣̣̥᷅


Question: C语言问题

在c语言里面判断的时候比如if（i）之类的就代表i不等于

&&是逻辑与，i是你输入的变量值

i同是有值～～

i  同时不为0

用户输入的那个i不是0 不能看做是&&i 应该是 (scanf("%ld",&i)!=EOF) && i &&在这里是逻辑与


Question: 书上的习题，求个思路

引用 12 楼 guicaisa 的回复:[quote=引用 10 楼 anshiny 的回复:] #include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。[/quote]  anshiny's code looks great! I don't want to be a dick here but I suspect its correctness in terms of "even distribution". Knuth's vol 2 has an implementation for this case and it comes with the probabilistic proof. That has been said, Knuth's algorithm will be slower than anshiny's since it requires a loop against the entire candidate list. Just want to point out here, in case someone is interested...

引用 16 楼 micropentium6 的回复:[quote=引用 12 楼 guicaisa 的回复:] [quote=引用 10 楼 anshiny 的回复:] #include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。[/quote]  anshiny's code looks great! I don't want to be a dick here but I suspect its correctness in terms of "even distribution". Knuth's vol 2 has an implementation for this case and it comes with the probabilistic proof. That has been said, Knuth's algorithm will be slower than anshiny's since it requires a loop against the entire candidate list. Just want to point out here, in case someone is interested...[/quote]你说的这鸟语人家听得懂吗？

第一次从0-9随机的取一个数，作为索引，该索引之后的值，依次前移，索引处的值即为此次取到的值，并将该值移动到数组的最后一个位置。 以后每次随机数的范围减一，比如第二次0-8，第三次0-7......直到取完所有的数。  该方法的最大好处是数组长度可以随意变化，所取数的个数也不受限制，并且只要一个循环就可完成。

我也做过

我也遇到这个问题我的那个是6合菜

引用 10 楼 anshiny 的回复:#include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。

#include <vector> #include <algorithm> #include <random> using namespace std; int main(void) { 	//采用c++11标准编写 	int data[10] = { 12, 9, 8, 7, 6, 2, 5, 2, 10, 15 }; // 10个数 	vector<int>v(begin(data), end(data));//保存到容器 	sort(begin(v), end(v));//排序 	v.erase(unique(begin(v), end(v)), end(v));//删除重复数字 	default_random_engine e;//随机数引擎 	for (int i = 0; i < 5;i++) 	{ 		uniform_int_distribution<unsigned> u(0, v.size());//生成0-v.size()的随机数 		int n = v[u(e)];//得到随机数 		cout << n << endl; 		v.erase(find(begin(v),end(v),n));//从容器删除已经打印出的随机数 	}		 	     return 0; }

#include <stdio.h> #include <stdlib.h> #include <time.h>  void main( ) { 	int data[10] = { 12, 98, 9, 89, 8,  878, 87, 23, 45, 235 }; // 10个数 	int flags[10] = {0}; // 哪些数被选中 	int i, k;  	srand(time(NULL)); // 随机种子  	for(i=0; i<5; i++) 	{ 		int count = 0;  		int r = rand() % (10 - i) + 1;	 		printf("random: %d \n", r);  		for(k=0; k<10; k++) 		{ 			if(flags[k]) continue; 			 			if(++count == r) 			{ 				flags[k] = 1; 				break; 			} 		} 	}  	printf("Result: "); // 打印结果 	for(i=0; i<10; i++) 	{ 		if(flags[i])  			printf("%d ", data[i]); 	}	 }

随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

随机数用于做序号，用数组保存10个数。数被抽取后，该位置写-1，下次抽取的时候，发现是-1.，那么从新抽取，直道5个数

另一种办法是：第一次在0~9之间取一个数，第二在0~8之间取一个数，。。。。。   引用 2 楼 qq530370925 的回复:你再定义一个5个元素的数组，第一次随机抽取，然后放到这个数组里去，第二次随机抽取，和第一个做判断，如果相等，不存入，不相等就存入，然后第三次随机，抽出来的再和那两个做判断，就这样五次。

这个是逻辑题吧？万一十个数都一样呢？？个人感觉~


Question: 关于链表插入的一个问题；

参考代码段 http://pan.baidu.com/s/17yIcQ

如果我来做的话，我会牺牲内存来换取搜索时间，也可以减少内存碎片 首先申请一段连续的内存，这里做个比喻就先申请 512 个 int 的内存，即 2048 字节 然后按 int 的字节长度进行分段，你的 value 代表数据序号，数据里的值为 value 的数量   int m_nDataCount = 0; int *m_pData = NULL; #define MAX_GROWUP    512  int GetValueCount(int nValue) {     if (nValue >= m_nDataCount)         return 0;     return m_pData[nValue]; }  int SetValue(int nValue) {     int *nNewData;      if ((m_nDataCount % MAX_GROWUP) == 0)     {         nNewData = new int[m_nDataCount + MAX_GROWUP];         memcpy(nNewData, m_pData, sizeof(int) * m_nDataCount);         memset(nNewData, 0, sizeof(int) * (m_nDataCount + MAX_GROWUP));         delete[] m_pData;         m_pData = nNewData;     }      m_nDataCount++;     m_pData[nValue]++;      return m_pData[nValue]; }  int main() {     SetValue(0);     SetValue(3);     SetValue(6);      SetValue(5); // 插入5      delete[] m_pData; // 释放资源      return 0; }

引用 3 楼 zhao4zhong1 的回复:仅供参考：//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //  赵老湿，你这个程序不需要那么多变量。 凡是弄一大堆变量的， 都不是真正理解指针的人写的程序。 Linux之父说过，很多高手都没有真正理解指针。

引用 2 楼 sholber 的回复:亲爱的楼主，有问题提问题，不要这么笼统地问。  # include <stdio.h> # include <stdlib.h>  typedef struct stgNODE {int data; struct stgNODE * next;} * PNODE;  int main (void) {     PNODE head = (PNODE) malloc (sizeof (struct stgNODE));     /* …… */ }  好的，感谢你的指正，我想问的问题是为什么我在插入之后会出现乱码

引用 3 楼 zhao4zhong1 的回复:仅供参考：//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //   老师你好，很感谢你热心的回答。但是你发的代码与我的问题关系好像不大。 我想请你看看我的代码，为什么插入之后会出现乱码。

add_link_list里面,  while的时候需要跳过第一个节点.第一个节点是头, 没有数据


Question: 数据结构单链表输出元素！程序编译通过，程序运行出现错误，实在检查不出来哪里的问题！请大神赐教

引用 6 楼 jiht594 的回复:[quote=引用 3 楼 lei___lei 的回复:] 不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！  你的Initsqlist没起作用. main中的L.next不是NULL,   你可以加一句L.next = NULL; 然后去掉没用的Initsqlist.  或者像#5那样改 [/quote] 太感谢你了！现在明白了，主要问题还是那个二维指针，直接传参和传递指针的区别！！谢谢了

引用 3 楼 lei___lei 的回复:不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！  你的Initsqlist没起作用. main中的L.next不是NULL,   你可以加一句L.next = NULL; 然后去掉没用的Initsqlist.  或者像#5那样改

搜一下"二重指针"  Status Initsqlist(Linklist *L)  //构造一个空的线性表！（头结点指针域为空） {     *L=(Linklist)malloc(sizeof(LNode));     if(!(*L))     {         printf("init fail!\n");         return ERROR;     }     else     {         (*L)->next=NULL;         printf("init sucessful!\n");         return OK;     } }  int main() { //    Linklist L;     LNode *L;     int i;     Initsqlist(&L);     printf("Please input the data :");     for(i=0; i<5; i++)         Linklistinsert(L,1,i);     print(L);     return 0; }

引用 1 楼 user-2 的回复:十有八九是建表的时候表尾指针没有置空  这是全部代码，劳烦帮我看一下，初始化链表Initlist时已经做了L->next=NULL;应该不是这个问题 #include<stdio.h> #include<stdlib.h>  typedef int Elemtype; typedef int Status;  #define  OK 1 #define  ERROR 0  struct Lnode               { 	Elemtype data; 	struct Lnode *next; }; typedef struct Lnode LNode; typedef struct Lnode *Linklist;   Status Initsqlist(Linklist L)  //构造一个空的线性表！（头结点指针域为空） { 	L=(Linklist)malloc(sizeof(LNode)); 	if(!L) 	{ 		printf("init fail!\n"); 		return ERROR; 	} 	else 	{ 		L->next=NULL;          		printf("init sucessful!\n"); 		return OK;		 	} }  Status Linklistinsert(Linklist L,int i,Elemtype e) { 	Linklist p,q; 	int j=0; 	p=L; 	while(p&&j<i-1) 	{ 		p=p->next; 		j++; 	} 	if(!p||j>i-1)   	{ 		printf("Insert error!\n"); 		return ERROR; 	} 	 	q=(Linklist)malloc(sizeof(LNode)); 	q->data=e;  	q->next=p->next; 	p->next=q; 	return OK;  }  void print(Linklist L) { 	Linklist p; 	p=L->next;	 	printf("The List is "); 	while(p) 	{ 		printf("%d",p->data); 		p=p->next; 	} 	printf("\n"); }    void main() { //    Linklist L; 	LNode L; 	int i; 	Initsqlist(&L); 	printf("Please input the data :"); 	for(i=0;i<5;i++) 		Linklistinsert(&L,1,i); 	print(&L); 	 }

引用 2 楼 jiht594 的回复:每次 LNode L; 都先L.next = NULL;  要不然 Linklist p;     p=L->next;     printf("The List is ");     while(p)   这个while里面永远是true 不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！

十有八九是建表的时候表尾指针没有置空


Question: 关于double类型变量给float变量赋值的溢出问题

但是编译器应该在编译的时候就报错啊，因为这是自动类型转换已经不能完成命令了。

和编译器没关系，和代码有关系。 格式化 double  的格式  是   “%lf”      而不是  “%f”

求大神指点迷津。

引用 1 楼 fly_dragon_fly 的回复:VC6不会连float和double都傻傻分不清楚吧，这么大的数foat没法放  难道这是VC的bug么？能把一个超范围的数直接放到float变量里？

引用 2 楼 mymtom 的回复:珍惜生命，远离VC6  版主，我就是随便看看，我记起里没有装VS，这个问题是VC的bug么？

珍惜生命，远离VC6

VC6不会连float和double都傻傻分不清楚吧，这么大的数foat没法放

不要再用VC6了，好吗？ vs2015都要出来了。用下vs2013吧，实在是太优雅了。


Question: C语言对TXT文本的操作

人家要定长字段，空格也要，你们都答的啥 定长其实是最容易的了，先把一行或者整个文件读到字符数组里，然后按定长分出字符串来，方法太多了 最傻瓜的方式，逐个字符的读也行

看着那些学生一学期从头到尾都是scanf，真是受不了。。。。  不过这种解析工作对初学者还是太有挑战了  引用 4 楼 my_live_123 的回复:fprintf写出去的文档再用fscanf读出来还是可行的。如果是自己手动写的文档，用fscanf读进内存，估计成功率不高。你得严格控制格式

首先，这个文件最好是你生成的，这样格式就由你来定了。 比如，规定必须以逗号分开，不加空格 001，李勇， 男， 1991，。。。。  这样你在读取的时候就容易解析了。  文本的解析是比较复杂的事情，没有像那本书上那样靠scanf的，那个跟实际完全脱轨。 你逐个比较，找到逗号，记录起始位置，分出来子串，就可以了。  我觉得你暂时忽略这个吧，有点难。 《C/C++学习指南》，http://www.afanihao.cn/c_guide/，第15章，我记得是给了例子。另外第16章中关于string.h中的函数，也可以使用。但是只凭第15章也够了。

引用 1 楼 iamshaofa 的回复:我观察了很多学生，学了一年只会了printf, scanf，你倒是会的多一点，还会fprintf, fscanf。。。。  请问有可行的办法吗？我想过把数据分割成定长，也就是把空格也读进去保存，但是不知道2进制的txt到底怎么弄。

引用 12 楼 gqjjqg 的回复:这样的文本，最简单的方法：  打开TXT编辑器，搜索替换Tab成一个空格，再搜索替换N个连续空格成1个空格。 这样你的数据就是 列 以空格分开，行以回车分开。 C程序读取时就非常容易了，每行以5个 s% 空格隔开 fscanf读入即可。  我去，还有空字段，我错了。

将所有空字段，类型为字符串的，用下划线'_'代替，类型为数值的用0代替。

引用 1 楼 iamshaofa 的回复:我观察了很多学生，学了一年只会了printf, scanf，你倒是会的多一点，还会fprintf, fscanf。。。。 我观察了很多用了半辈子C语言的，都不会取scanf函数的返回值。

引用 7 楼 my_live_123 的回复:如果每个字段不为空，那么读取文件，自己分割字段，解析文件。比如你的情况，一次读取一行，9个字段为一条记录。可以尝试 嗯 这个我能理解，考虑到字段有些为空，处理起来很难，应为不是太统一，我暂时还是不考虑这个问题，先手解决分割字段吧。

引用 6 楼 iamshaofa 的回复:给个实际的建议： 学习使用第三方库，比如tinyxml，把它存为xml格式，然后用tinyxml库来读取。  人家已经把最复杂的解析工作给做好了，你只管调用就可以了。 嗯嗯，谢谢，我会去试着学习的


Question: C语言 关于通过数组求素数问题。


Question: gcc的stdlib.h到底其实现文件在哪里？

1.库文件已经以动态库或静态库方式放在指定目录当中，头文件一般放在/usr目录下 2.需要自主下载glib源码

下载glibc源码再grep一下就可以了。

你这是精力过剩么？  gcc的头文件在 /include下面，或/usr/include下面 没有提供对应的源文件，而是以glibc库的形式提供的  你可以下载gcc的整个源码，那里面有，不过你看那个有什么用呢？

引用 8 楼 iamshaofa 的回复:source insight 解决一切问题   引用 2 楼 wangzuxi 的回复:下载glibc源码再grep一下就可以了。 source insight适当用也不错，以前我也比较依赖source insight，但后来还是自己grep比较精确。

引用 5 楼 javashit 的回复:[quote=引用 4 楼 JiangWenjie2014 的回复:]  这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了  你意思是说vim+ctags，对吧？ [/quote]  是啊，我现在用glib，搜索函数定义，结构体定义，宏定义就是用vim + ctags定位的，非常好用。

linux下一切皆有源码，就看你找不找的到。  支持2楼。

引用 4 楼 JiangWenjie2014 的回复:这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了  你意思是说vim+ctags，对吧？

引用 3 楼 javashit 的回复:已经下载了，并且安装了源代码包  可是stdlib.h的实现文件，应该是由一组源代码文件实现的，这组源代码文件名字应该不是stdlib.c,  所以现在找不出rand()函数的源代码到底在哪里  是可以用grep，但是这个grep恐怕也不是很容易写出来吧  这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了


Question: 求个问题的思路

手打的，就这个意思吧，面向对象的写法。

class Filter {       bool accept(char ch); };  bool  do_filter(char ch) {      for(int i=0; i<6; i++)      {            if( fs[i]. accept(ch))                   return true;      }     return false; }  main() {     Filter  fs[6];    const char* text= "123234343534";    for(int i=0; i<strlen(text); i++)    {         char ch = text[i];         do_filter(ch);    } }  推荐一本书：《C/C++学习指南》 http://www.afanihao.cn/c_guide/ ，适用C，也适合C++，一看就懂，“不可能看不懂”。在线阅读，配套答疑平台，实在不懂就直接向作者提问。专业人士编写，与企业标准对接。

输入是啥？输出要得到啥？

仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //


Question: 求助！数据结构单链表插值问题。求各位给讲一下！谢谢了

多谢各位的回复！

while循环后还有第3种情况 p != NULL; j >= i -1; i = 1，认为是有效的，直接在表头后插入元素 i <= 0，导致0 > i - 1,有if返回错误

Status ListInsert(LinkList L,int i,ElemType e)  // 在带头结点的单链线性表 L中第 i个位置之前插入元素 e { 	int j=0; 	LinkList p=L,s;//p指向头结点 	while(p&&j<i-1) // 寻找第 i-1个结点 	{ 		p=p->next; 		j++;//位置计数器 	} 	/*执行到这里有2种情况 		1.p=NULL；j <= i - 1;->表太短，要求的位置靠后 		2.p != NULL; j = i -1;->插入位置在表中 	*/ 	if(!p||j>i-1) //处理第1种情况，并处理i <= 0的无效输入 		return ERROR;  	//分配结点并初始化成员 	s=(LinkList)malloc(sizeof(LNode));  	s->data=e;   	//入表 	s->next=p->next; 	p->next=s;  	return OK; }

Status ListInsert(LinkList L,int i,ElemType e)  // 在带头结点的单链线性表 L中第 i个位置之前插入元素 e  {  int j=0;  LinkList p=L,s;  这道题归根结底是考察指针的使用。不管是谁，要是做这题时，在函数内部声明了多于一个的LinkList变量，做这题就失去了意义。这道题中的j也是多余的。

你说的对啊 L中第 i个位置之前插入元素 e.  你说的情况有0个元素, ListInsert时, 第2个参数i只能是0.  如果是1, 就是要在第1个元素前插入e, 但是你一个元素都没有啊  所以才有这句, p!的时候返回ERROR if(!p||j>i-1) // i小于 1或者大于表长 return ERROR;


aaa a  另外提交的时候把freopen去掉

引用 3 楼 FancyMouse 的回复:aaa a  另外提交的时候把freopen去掉 所以是int j = start+1吗？

引用 1 楼 sholber 的回复:不懂你的意思。。。 以一个样例输入 VERDI vivaVittorioEmanueleReDiItalia 为例 从t[0]开始，s字符串的V与在t字符串的第4位（t[4]）V匹配成功 然后从t[4]开始往后，s字符串的E与t[12]E匹配成功 然后从t[12]开始往后，s字符串的R与t[20]R匹配成功 然后从t[20]开始往后，s字符串的D与t[22]D匹配成功 然后从t[22]开始往后，s字符串的I与t[24]I匹配成功  这个样例输出Yes

不懂你的意思。。。


Question: 火眼晶晶 找不同  T_T

多谢！！！！！

scanf("a = %3hd%4hd,b = %3hd%4hd",&a,&b,&c,&d);


Question: 不懂？？

根据父母的身高推测孩子身高的程序  if语句里的=改为==试试

一步一步调试。。

不懂什么？感觉这格式这么别扭，换成一个简单的不就好了吗

输入格式。。自己调试


Question: 我做一个题目的时候scanf出现问题了

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h" #include "stdio.h"  int main() {     char a,b;     printf("write 1st!\n");     scanf("%c",&a);     switch (a)     {     case 'M'||'m':     {         printf("\ntoday is monday");     }     break;     case 't':     {         getchar();         b = getchar();         if (b=='u' || b=='U')             printf("\ntoday is tuesday");         else             printf("\ntoday is thursday");     }     break;     case 'w':     {         printf("\ntoday is wednesday");     }     break;     case 'f':     {         printf("\ntoday is friday");     }     break;     case 's':     {         getchar();         b = getchar();         if (b=='a'||b=='A')             printf("\ntoday is saturday");         else             printf("\ntoday is sumday");     }     break;     }     return 0; }

引用 12 楼 u012421456 的回复:switch中没有case u，自然就没有输出了  新人没太懂 该怎么改呢

switch中没有case u，自然就没有输出了

引用 10 楼 u012421456 的回复:楼主输入的是什么内容  第一个输入的是t 第二个u

楼主输入的是什么内容

引用 8 楼 u012421456 的回复:[quote=引用 7 楼 tanqizhi 的回复:] 注释是系统自带的。。。。 switch接的case不能接IF吗 不好意思啊 我没说清楚，我的意思是我注释的地方是我没弄明白   可以的，它可以放任何正确的语句[/quote]  引用 8 楼 u012421456 的回复:[quote=引用 7 楼 tanqizhi 的回复:] 注释是系统自带的。。。。 switch接的case不能接IF吗 不好意思啊 我没说清楚，我的意思是我注释的地方是我没弄明白   可以的，它可以放任何正确的语句[/quote]  注释是vs2012自带的 为何没输出呢。。 输入第二个字幕后直接任意键继续

引用 7 楼 tanqizhi 的回复:注释是系统自带的。。。。 switch接的case不能接IF吗 不好意思啊 我没说清楚，我的意思是我注释的地方是我没弄明白   可以的，它可以放任何正确的语句

引用 6 楼 u012421456 的回复:// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h" #include "stdio.h" void select(char a); int main() {     char a,b;     printf("write 1st!\n");     scanf("%c",&a);     select(a);     printf("write 2nd\n");     getchar();     scanf("%c",&b);     select(b);      return 0; }  void select(char a) {      switch (a)     {     case 'M'||'m':     {         printf("\ntoday is monday");     }     break;     case 't':     { //        if (b=='u')             printf("\ntoday is tuesday"); //        else             printf("\ntoday is thursday");     }     break;     case 'w':     {         printf("\ntoday is wednesday");     }     break;     case 'f':     {         printf("\ntoday is friday");     }     break;     case 's':     { //        if (b=='a'||'A')             printf("\ntoday is saturday"); //       else             printf("\ntoday is sumday");     }     break;     } }  一个switch，如何判断两个输入？ 注释部分是我没搞懂楼主的意思   注释是系统自带的。。。。 switch接的case不能接IF吗

引用 4 楼 u012421456 的回复:应该是接受了第一个scanf的回车\n了 在第二个scanf前面加getchar();试试  另外，判断相等是==而不是=  输入好了。。。但压根不输出了。。。打完第二个以后直接按任意键继续。。。

引用 1 楼 u012421456 的回复:scanf_s的用法和scanf是不太一样的  话说这程序上传的真是让人纠结啊   而且用scanf不用scanf_s直接报错啊

引用 1 楼 u012421456 的回复:scanf_s的用法和scanf是不太一样的  话说这程序上传的真是让人纠结啊  我也不知道怎么搞的。。

scanf_s的用法和scanf是不太一样的  话说这程序上传的真是让人纠结啊


Question: c初学者求c大神相助

哪位大神解释下上面程序的q=p和P=q

引用给p输入数据后，q有指向p？？ 不太明白，楼主能否换个方式描述一下？

如果程序没有粘贴错的话，就不需要 “给p输入数据后，q有指向p？？”


Question: 我用c语言写了一个windows窗口，为什么有提示未定义的变量类型

引用 1 楼 zhao4zhong1 的回复:UNIT和UINT不是一回事！ TranslateMesage和TranslateMessage不是一回事！  LRESULT CALLBACK WndProc(HWND,UNIT,WPARAM,LPARAM) 和 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {  不是一回事！   关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”谢谢赵老师，是我太粗心了，我本来是对照着例子打的  想熟悉一下各个函数的参数，没想到错这么多


Question: VC编译器，如何在调试程序的同时对其中某个变量输入一个值，

在调试过程中，选择菜单“调试”、“窗口”、“即时”，可以显示“即时窗口”，在这个窗口可以输入并执行代码。

注意%C 的用法，接受一个字符的话，还要get掉回车。

先在Watch窗口中添加该变量，然后在该变量的值处点鼠标左键，输入新值，回车。

scanf("%c",&c1);  在这里F9下个断点, 然后F5运行起来. 这时程序会执行到断点这句, 这时,再按F10, 就需要输入数据才能执行.  你输入一个数据据, 然后程序会走到下一句....


Question: 疑问：具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。

static一定是静态存储时期的变量，但静态变量不一定都是用static表示的，所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。

我最近也在看，static表示的并不是静态存储时期，表示的是在文件作用域情况下是内部链接的，不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接，，，，，，，所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。

引用 4 楼 zhao4zhong1 的回复:所以说： 千万字的解释不如举一个实际例子。 说是一物即不中。 “盲人摸太阳” 老师，关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦，就是在纠结“具有外部链接的静态变量”这个东西，不知道他到底是什么样的东西，感谢2位指点，了解了！

所以说： 千万字的解释不如举一个实际例子。 说是一物即不中。 “盲人摸太阳”

1楼的例子代码很赞啊！

引用 1 楼 sholber 的回复:我就说，有些教程看上去通俗易懂，却只会把问题越说越糊涂。 标识符的链接、作用域和存储期是非常容易混淆的东西。 我本来对CPP印象挺好（虽然我只是大致翻了翻），但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题？ 它应该这样说：“具有文件作用域的标识符是外部链接的，它所指示的对象具有静态存储期。” 顺便说一句，同样是static，它的位置不同，意义也不同： static int i;  //文件作用域，内部链接，静态存储期。 int j;  //文件作用域，外部链接，静态存储期。 int f (void) {     static int x;    //块作用域，无链接，静态存储期。     int y;    //块作用域，无链接，自动存储期和临时生存期。     extern int i;    //外部链接，与前面的'static int i'指示同一个对象。     extern int j;    //外部链接，与指示前面的'int j'指示同一个对象。 } 非常感谢你的解答，英文的原话是：“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文，应该没出什么大差错，所以我疑问不解，也就是说不管中文还是英文，就这句话而言，不存在“外部链接的静态变量”？


Question: 新人第一次发帖。求大腿帮忙指出错误。

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数∧ 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);  (*iop)--;break;         case  8: x=cos(x);  (*iop)--;break;         case  9: x=tan(x);  (*iop)--;break;         case 10: x=sqrt(x); (*iop)--;break;         case 11: x=asin(x); (*iop)--;break;         case 12: x=acos(x); (*iop)--;break;         case 13: x=atan(x); (*iop)--;break;         case 14: x=log10(x);(*iop)--;break;         case 15: x=log(x);  (*iop)--;break;         case 16: x=exp(x);  (*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }

scanf("%f%c%f",&a,&op,&b);

#include<stdio.h>  int main() { float a,b,result; char op; int flag; printf("input a,b:\n"); scanf("%f%f%c",&a,&b,&op); flag=1; switch(op) { case'+':result=a+b; break; case'-':result=a-b; break; case'*':result=a*b; break; case'/':if(b) result=a/b;         else flag=0; break;     default:flag=0;  } if(flag) printf("result=%f",result); else printf("invalid input y or op\n"); }  把scanf改为红色部分，注意在键盘输入时，两个数字之间要用空格隔开，但是第二个数与后面输入的字符之间不要有空格，紧接着输入就好。

没有看到哪里对op进行初始化或者赋值

沙发自己坐了。 等大腿帮忙指出错误


Question: 求用C读取网页的源代码

引用 12 楼 u012421456 的回复:[quote=引用 11 楼 qq_25264405 的回复:] [quote=引用 10 楼 u012421456 的回复:] [quote=引用 9 楼 qq_25264405 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 qq_25264405 的回复:] stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试[/quote] 删掉显示很多错误，没删显示没找到这个文件[/quote] 这个是VS下的文件[/quote] 那如何在VC中用？？ [/quote] 这个，看去掉后报什么错，然后改吧，具体我也没什么办法了[/quote] 主要是函数的定义确实

引用 3 楼 jiht594 的回复:// Server.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) {    SOCKET hsocket;   SOCKADDR_IN saServer;   WSADATA     wsadata;   LPHOSTENT lphostent;   int     nRet;     char   Dest[3000];  char* host_name="www.baidu.com"; char* req="GET / HTTP/1.1\r\n" //此为要发送的数据包 "Accept: image/gif, image/x-xbitmap, image/jpeg, imagepeg, application/x-shockwave-flash, applicationnd.ms-excel, applicationnd.ms-powerpoint, application/msword, */*\r\n" "Accept-Language: zh-cn\r\n" "Connection: Keep-Alive\r\n" "Host: www.baidu.com\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n";  // 初始化套接字      if(WSAStartup(MAKEWORD(2,2),&wsadata))         printf("初始化SOCKET出错！");     lphostent=gethostbyname(host_name);          if(lphostent==NULL)              printf("lphostent为空！");       hsocket   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);          saServer.sin_family = AF_INET;          saServer.sin_port = htons(80);          saServer.sin_addr =*((LPIN_ADDR)*lphostent->h_addr_list);       // 利用SOCKET连接       nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));          if(nRet == SOCKET_ERROR)          {         printf("建立连接时出错！");              closesocket(hsocket);         return 0;     }     // 利用SOCKET发送        nRet = send(hsocket,req,strlen(req),0);       if(nRet==SOCKET_ERROR)       {           printf("发送数据包时出错！");           closesocket(hsocket);       }           nRet=1;          while(nRet>0)          {           // 接收返回数据包           nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);              if(nRet>0)             Dest[nRet]=0;         else                  Dest[0]=0;           // 显示返回数据包的大小、内容          printf("\nReceived   bytes:%d\n",nRet);              printf("Result:\n%s",Dest);          } } +1这个靠谱

#include <stdio.h>  int main(int argc,char** argv) {     system("wget %s","http://bbs.csdn.net/topics/390996880");     // 处理之。。。     return 0; }

好像上面的解决方法都是代码很长。其实有更简短的，C++下。

引用 11 楼 qq_25264405 的回复:[quote=引用 10 楼 u012421456 的回复:] [quote=引用 9 楼 qq_25264405 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 qq_25264405 的回复:] stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试[/quote] 删掉显示很多错误，没删显示没找到这个文件[/quote] 这个是VS下的文件[/quote] 那如何在VC中用？？ [/quote] 这个，看去掉后报什么错，然后改吧，具体我也没什么办法了

引用 10 楼 u012421456 的回复:[quote=引用 9 楼 qq_25264405 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 qq_25264405 的回复:] stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试[/quote] 删掉显示很多错误，没删显示没找到这个文件[/quote] 这个是VS下的文件[/quote] 那如何在VC中用？？

引用 9 楼 qq_25264405 的回复:[quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 qq_25264405 的回复:] stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试[/quote] 删掉显示很多错误，没删显示没找到这个文件[/quote] 这个是VS下的文件

引用 8 楼 jiht594 的回复:[quote=引用 7 楼 qq_25264405 的回复:] stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试[/quote] 删掉显示很多错误，没删显示没找到这个文件

引用 7 楼 qq_25264405 的回复:stdafx.h这个在VC++和Cfree都没有，怎么编译  vc新建工程应该自带的, 没有你删了#Include "stdafx.h"这一句试试

stdafx.h这个在VC++和Cfree都没有，怎么编译  引用 3 楼 jiht594 的回复:// Server.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) {    SOCKET hsocket;   SOCKADDR_IN saServer;   WSADATA     wsadata;   LPHOSTENT lphostent;   int     nRet;     char   Dest[3000];  char* host_name="www.baidu.com"; char* req="GET / HTTP/1.1\r\n" //此为要发送的数据包 "Accept: image/gif, image/x-xbitmap, image/jpeg, imagepeg, application/x-shockwave-flash, applicationnd.ms-excel, applicationnd.ms-powerpoint, application/msword, */*\r\n" "Accept-Language: zh-cn\r\n" "Connection: Keep-Alive\r\n" "Host: www.baidu.com\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n\r\n";  // 初始化套接字      if(WSAStartup(MAKEWORD(2,2),&wsadata))         printf("初始化SOCKET出错！");     lphostent=gethostbyname(host_name);          if(lphostent==NULL)              printf("lphostent为空！");       hsocket   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);          saServer.sin_family = AF_INET;          saServer.sin_port = htons(80);          saServer.sin_addr =*((LPIN_ADDR)*lphostent->h_addr_list);       // 利用SOCKET连接       nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));          if(nRet == SOCKET_ERROR)          {         printf("建立连接时出错！");              closesocket(hsocket);         return 0;     }     // 利用SOCKET发送        nRet = send(hsocket,req,strlen(req),0);       if(nRet==SOCKET_ERROR)       {           printf("发送数据包时出错！");           closesocket(hsocket);       }           nRet=1;          while(nRet>0)          {           // 接收返回数据包           nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);              if(nRet>0)             Dest[nRet]=0;         else                  Dest[0]=0;           // 显示返回数据包的大小、内容          printf("\nReceived   bytes:%d\n",nRet);              printf("Result:\n%s",Dest);          } }

用python啦，好用到cry

引用 1 楼 jiht594 的回复:搜索curl求具体代码

搜索curl


Question: 请教不用加volatile的情况

引用 9 楼 flyrack 的回复:引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。

引用 9 楼 flyrack 的回复:引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }   这位仁兄，你为什么不给我一个EXE文件让我优化呢？把程序A换成程序B，从C换成C++，你觉得这样无理取闹有意思吗？

加上volatile,就是为了防止编译器把寄存器、内存、外设接口给优化了，一般进程、中断函数中用的比较多

引用 32 楼 sholber 的回复:[quote=引用 31 楼 derekrose 的回复:] [quote=引用 30 楼 sholber 的回复:] [quote=引用 29 楼 derekrose 的回复:] 。。。咋还吵吵起来了    既然互相都不服就来pk吧  别扯什么情商做人语言学的了     最喜欢看别人pk了呢！  看热闹不怕事大呀。 虽然你是板猪，我俩一人给你一下子，你照样哑火，Is'nt it ？[/quote]  哥们  我说的pk就是专指技术讨论  你俩在这互相掐真没啥意思    板猪什么的少说  换了别的板猪你早就禁言了[/quote] 哈哈，开开玩笑怕什么。说话，禁言也不能光禁我一个，那个fmouse那“货”也得禁，不然不公平啊……哈哈[/quote]  是的  都得禁，所以讨论讨论问题就行了  别互相嘴炮了

引用 31 楼 derekrose 的回复:[quote=引用 30 楼 sholber 的回复:] [quote=引用 29 楼 derekrose 的回复:] 。。。咋还吵吵起来了    既然互相都不服就来pk吧  别扯什么情商做人语言学的了     最喜欢看别人pk了呢！  看热闹不怕事大呀。 虽然你是板猪，我俩一人给你一下子，你照样哑火，Is'nt it ？[/quote]  哥们  我说的pk就是专指技术讨论  你俩在这互相掐真没啥意思    板猪什么的少说  换了别的板猪你早就禁言了[/quote] 哈哈，开开玩笑怕什么。说话，禁言也不能光禁我一个，那个fmouse那“货”也得禁，不然不公平啊……哈哈

引用 30 楼 sholber 的回复:[quote=引用 29 楼 derekrose 的回复:] 。。。咋还吵吵起来了    既然互相都不服就来pk吧  别扯什么情商做人语言学的了     最喜欢看别人pk了呢！  看热闹不怕事大呀。 虽然你是板猪，我俩一人给你一下子，你照样哑火，Is'nt it ？[/quote]  哥们  我说的pk就是专指技术讨论  你俩在这互相掐真没啥意思    板猪什么的少说  换了别的板猪你早就禁言了

引用 29 楼 derekrose 的回复:。。。咋还吵吵起来了    既然互相都不服就来pk吧  别扯什么情商做人语言学的了     最喜欢看别人pk了呢！  看热闹不怕事大呀。 虽然你是板猪，我俩一人给你一下子，你照样哑火，Is'nt it ？

阿兰。图灵的传记电影《The Imitation Game》，看看吧，1080p的。

引用 26 楼 FancyMouse 的回复:[quote=引用 23 楼 sholber 的回复:] [quote=引用 21 楼 FancyMouse 的回复:] [quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  这话应该我来说。我也是看什么人说什么话，所以，你听起来就不爽了，于是你就蹦起来了。听过那个相声吗－－“我大学毕业我跟谁说过”，你的心态就像这个。 论坛是个自由讨论的地方，你怕人说就不要来。你说话本来就是给人看，供人评论的，玩不起还来干嘛。[/quote] 变成我怕人说了。也是醉了。怕人说我回帖干啥？ 而且拉回原来的话题，标准委员会花多少时间在一个特性上和一个特性研究的时间多少根本就没有关系。因为当初没有仔细思考过后来被深深的坑了的例子还少么？我就说我知道的volatile，你来扯标准委员会花多少时间引入，这不是瞎BB是啥。 做人成熟点。[/quote]  一个人文化素养不够是多么可怕的事！ ”你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。“ ——这本来是一句调侃的话（也许是我看美剧看多了），居然引发这么大一件事。 我的评价是，少看点计算机的书，多学学人情世故。[/quote] 你要是平时说话少点刺，我是不会把这句话看成刺的。你真以为这句话是唯一的原因？回头看看自己其他帖子吧。真要不是故意带刺的话，那我承认我说过头了。[/quote]  不争了，不争了。我羸了，会多块肉，你输了，会少块肉吗？ 我要上帝国下电影了。祝生活愉快！ 刺还是要带的——我就不明白，明明自己对某个问题的认识不对，还要龇牙咧嘴、争先恐后地发言（不是说你啊），所以刺还是要带滴……

引用 23 楼 sholber 的回复:[quote=引用 21 楼 FancyMouse 的回复:] [quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  这话应该我来说。我也是看什么人说什么话，所以，你听起来就不爽了，于是你就蹦起来了。听过那个相声吗－－“我大学毕业我跟谁说过”，你的心态就像这个。 论坛是个自由讨论的地方，你怕人说就不要来。你说话本来就是给人看，供人评论的，玩不起还来干嘛。[/quote] 变成我怕人说了。也是醉了。怕人说我回帖干啥？ 而且拉回原来的话题，标准委员会花多少时间在一个特性上和一个特性研究的时间多少根本就没有关系。因为当初没有仔细思考过后来被深深的坑了的例子还少么？我就说我知道的volatile，你来扯标准委员会花多少时间引入，这不是瞎BB是啥。 做人成熟点。[/quote]  一个人文化素养不够是多么可怕的事！ ”你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。“ ——这本来是一句调侃的话（也许是我看美剧看多了），居然引发这么大一件事。 我的评价是，少看点计算机的书，多学学人情世故。[/quote] 你要是平时说话少点刺，我是不会把这句话看成刺的。你真以为这句话是唯一的原因？回头看看自己其他帖子吧。真要不是故意带刺的话，那我承认我说过头了。

引用 24 楼 FancyMouse 的回复:[quote=引用 22 楼 sholber 的回复:] [quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  1，论坛是个开放的地方，玩不起不要来； 2，相比于C语言，我对你的了解更多（通过这两个回合）。乌鸦可以笑猪黑，这不犯法，骂人是素质人品问题，建议别忘刷牙。[/quote] 1. 话里带刺的比单单说几句脏话的素质差不是一个数量级。你觉得你道德高尚自便。真奇怪程序员还有这么注重表面功夫的。氛围就是被你这种说话带个刺然后宣称自己不是源头的人给带坏的。这种人标准称呼叫做troll。 2. 你觉得你比我了解的更多，那就算这样吧。事实也差不多，我基本不懂C也不懂C++，标准文本读过的部分1%都不到，基本都是现用现搜，比你懂的多才奇怪呢。[/quote]  首先，我不是程序员，虽然十几年前我干过这一行。我的工作和计算机关系不大； 其次，话里带刺是语言学的范畴，是语言技巧问题，而脏话永远是素质问题； 再次，我是说，我对你的了解比我了解计算机更多——换言多，我了解你，不太了解计算机，不要看错了； 第四，嘴上带刺的人往往很好心，我相信我就是这样的； 最后，你最后的发言让我很不好意思 ，因此，我向你道个歉！这是我衷心的。

引用 22 楼 sholber 的回复:[quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  1，论坛是个开放的地方，玩不起不要来； 2，相比于C语言，我对你的了解更多（通过这两个回合）。乌鸦可以笑猪黑，这不犯法，骂人是素质人品问题，建议别忘刷牙。[/quote] 1. 话里带刺的比单单说几句脏话的素质差不是一个数量级。你觉得你道德高尚自便。真奇怪程序员还有这么注重表面功夫的。氛围就是被你这种说话带个刺然后宣称自己不是源头的人给带坏的。这种人标准称呼叫做troll。 2. 你觉得你比我了解的更多，那就算这样吧。事实也差不多，我基本不懂C也不懂C++，标准文本读过的部分1%都不到，基本都是现用现搜，比你懂的多才奇怪呢。

引用 21 楼 FancyMouse 的回复:[quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  这话应该我来说。我也是看什么人说什么话，所以，你听起来就不爽了，于是你就蹦起来了。听过那个相声吗－－“我大学毕业我跟谁说过”，你的心态就像这个。 论坛是个自由讨论的地方，你怕人说就不要来。你说话本来就是给人看，供人评论的，玩不起还来干嘛。[/quote] 变成我怕人说了。也是醉了。怕人说我回帖干啥？ 而且拉回原来的话题，标准委员会花多少时间在一个特性上和一个特性研究的时间多少根本就没有关系。因为当初没有仔细思考过后来被深深的坑了的例子还少么？我就说我知道的volatile，你来扯标准委员会花多少时间引入，这不是瞎BB是啥。 做人成熟点。[/quote]  一个人文化素养不够是多么可怕的事！ ”你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。“ ——这本来是一句调侃的话（也许是我看美剧看多了），居然引发这么大一件事。 我的评价是，少看点计算机的书，多学学人情世故。

引用 19 楼 FancyMouse 的回复:[quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  1，论坛是个开放的地方，玩不起不要来； 2，相比于C语言，我对你的了解更多（通过这两个回合）。乌鸦可以笑猪黑，这不犯法，骂人是素质人品问题，建议别忘刷牙。

引用 20 楼 sholber 的回复:[quote=引用 19 楼 FancyMouse 的回复:] [quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  这话应该我来说。我也是看什么人说什么话，所以，你听起来就不爽了，于是你就蹦起来了。听过那个相声吗－－“我大学毕业我跟谁说过”，你的心态就像这个。 论坛是个自由讨论的地方，你怕人说就不要来。你说话本来就是给人看，供人评论的，玩不起还来干嘛。[/quote] 变成我怕人说了。也是醉了。怕人说我回帖干啥？ 而且拉回原来的话题，标准委员会花多少时间在一个特性上和一个特性研究的时间多少根本就没有关系。因为当初没有仔细思考过后来被深深的坑了的例子还少么？我就说我知道的volatile，你来扯标准委员会花多少时间引入，这不是瞎BB是啥。 做人成熟点。

引用 19 楼 FancyMouse 的回复:[quote=引用 17 楼 sholber 的回复:] [quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。[/quote]  这话应该我来说。我也是看什么人说什么话，所以，你听起来就不爽了，于是你就蹦起来了。听过那个相声吗－－“我大学毕业我跟谁说过”，你的心态就像这个。 论坛是个自由讨论的地方，你怕人说就不要来。你说话本来就是给人看，供人评论的，玩不起还来干嘛。

引用 17 楼 sholber 的回复:[quote=引用 16 楼 FancyMouse 的回复:] [quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。[/quote] 我一般是看什么人说什么话的。看这种自己水平也就那样，还十句话里九句带刺的我就是不爽。

据说嵌入式编程时, 需要用到, 但是我没接触过  只有多线程共享的基本数据类型 需要这个关键字(个人理解, 如果错了 不要打我,)

引用 16 楼 FancyMouse 的回复:[quote=引用 15 楼 sholber 的回复:] [quote=引用 9 楼 flyrack 的回复:] 引用孤陋寡闻。你试试： gcc ... 和 gcc ... -O3 没试过我会出来说吗？ 给你代码 你优化出来给我看看  #include <iostream>       #include <thread>   #include <chrono> #include <stdio.h>   int ready=0;   void foo()  { std::chrono::seconds second(1); std::this_thread::sleep_for(second); ready=1; }  int main()  { std::thread (foo).detach();                int n=0;   while (!ready)   {   std::cout<<n++<<"\n";   } return 0; }  引用 10 楼 FancyMouse 的回复:volatile大多数情况下对付的不是cpu修改的内存。memory mapping以后设备更新内存的时候它自己是没法invalidate cpu端的cache的，需要cpu主动invalidate cache再读内存才能读到正确的值。 cpu这边的话C和C++新版标准现在都有多线程的memory model，编译器不会对于全局变量这种其他线程可见的变量也假设成单线程给错误的优化掉，所以你们战的例子其实没啥意义。不过话说回来volatile本身也和多线程没啥关系，这要战起来也是暴露水平的。  你们在volatile上花的时间比当初决定在标准中引入这个关键字时花的时间要多，超出了一个数量级。[/quote] 关你吊事。我自己理解就看几篇文档几分钟的事，教人的时候才花的时间多。我愿意花时间告诉别人我知道的，不用你瞎BB。[/quote] 是“屌”不是“吊”，古人有时候成写“鸟”，注意提高文化素养。 C语言和屌有什么关系，还真没注意。话说理解屌有时候几分钟是不够的，仁兄你又吹牛了。 本来觉得你人不错，谁知道你一张嘴就漏了馅。看来网络不靠谱。


Question: 一个算法问题

看了半天，原来只是 奇数从小到大， 偶数从大到小。  数组大小N， 根据N奇偶性，先排列奇数，  引用 4 楼 KenZhang1031 的回复:交换排序，比如：0,1,2,3,4,5，按以下过程： 0,1,2,3,4,5   1,0,3,2,5,4   // 从第0个开始两两交换 1,3,0,5,2,4   // 从第1个开始两两交换 1,3,5,0,4,2   // 从第2个开始两两交换 1,3,5,4,0,2  // 从第3个开始两两交换 1,3,5,4,2,0  // 从第4个开始两两交换， 下标最大为5，最后没得换了，结束  可以再改进一下，索引本身有序，最终结果 左边列奇数索引递增，右边列偶数递减： 0,1,2,3,4,5   // 从第0个开始两两交换  增加条件：第二个操作数是奇数 交换，否则不交换 得到： 1,0,3,2,5,4   // 从第1个开始两两交换 同0可得： 1,3,0,5,2,4   // 从第2个开始两两交换 同0可得： 1,3,5,0,2,4   // 从第3个开始两两交换 不满足 第二个操作数是奇数 的条件，这里开始逆序交换右边偶数列 可得： 1,3,5,4,2,0    增加一个奇数判断，循环和交换次数更少，效率更高。

这个其实简单，加多两个临时变量一次交换机可比如偶数情况 135420， 第一步记录临时变量tmp1=A[5]，然后A[5]=A[0] 第二步记录临时变量tmp2=A[2]，然后A[2]=tmp1，tmp1=tmp2 第三步记录临时变量tmp2=A[4]，然后A[4]=tmp1，tmp1=tmp2 第四步记录临时变量tmp2=A[3]，然后A[3]=tmp1，tmp1=tmp2 第五步记录临时变量tmp2=A[1]，然后A[1]=tmp1，tmp1=tmp2 第六步记录临时变量tmp2=A[0]，然后A[0]=tmp1，tmp1=tmp2 至于为什么这个顺序，自己写个函数计算位置即可

KenZhang1031 有创意，我写下看看！

只是换位置，不是对里面的值排序.

我想到一个时间不是很好的算法，先判断前一个数和后一个数的关系，如果不满足你这种规则就交换数据，进行(n-1)*(n-1)此循环。然后算出序列中奇数的个数a，然后按照规则排序前a个数。  for(size_t i = 0 ; i < col.size() - 1 ; ++i) 	{ 		for(size_t j = 0 ; j < col.size()-1 ; ++j) 			if((col[j]%2 == 0 && col[j+1]%2 == 1) || (col[j]%2 == 0 && col[j+1]%2==0 && col[j+1] > col[j]) || (col[j]%2==1 && col[j+1] == 1 && col[j]>col[j+1])) 				swap(col[j] , col[j+1]) ; 	}  	//count elements with odd 	num = count_if(col.begin() , col.end() , bind2nd(modulus<int>() , 2) ) ;  	sort(col.begin() , col.begin()+num) ;

你是想算法空间复杂度越低越好吧， 搜：排序算法+空间复杂度

a[0]到a[max]的值大小顺序是怎么样的？从小到大？

不知道你在说什么

三连发了，有点错误，要分奇偶数

这样写也行  乘2用移位算更快

排毛线的序啊，用公式算新的索引坐标即可


Question: 文科小白想学编程

同为菜鸟卧槽心累

这样的帖子果然最容易火！

妹砸, 英语不好的话就学易语言, 英语还可以的话就学正统大德大智慧C吧, 其实正统大德大智慧C也不是必要的, 吾只是想劝妹砸一句, 万不可学歪门邪道道德沦丧毁三观Web相关编程, 妹砸玩那个三天加班就变黄脸婆

只要有兴趣，学起来会很快，不在于文理还是工科  网上、书店都有很多入门的书与视频，楼主可以找些看  至于编译软件可以用VS2012  另外编程干嘛用“黑电脑”形容。。

怎么会想着学编程的~~~学设计的不好吗？？

从经典书籍学起

既然是文科妹子，那就去找计算机的屌丝，肯定会把你教会的。从安装软件，到学会编程语言。 屌丝嘛，请他吃顿饭作为回报就可以啦，相信他很高兴的~

先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

下个vc装上去玩玩， 觉得太大下个notepad++ 配上gcc就够了，

找计算机专业的男生来教你就行了，比如我

引用 5 楼 iamshaofa 的回复:对于新手来说，一本好书最重要。你要是看谭浩强的书，那你别指望学会编程了。你在线阅读这本书 http://www.afanihao.cn/c_guide/ ，照着例子抄一篇，应该就差不多了。  又在推你的书？于是我又点进去，一眼发现这些：  大括号末尾没有分号同样声明一个枚举： printf ("%d\n", sizeof (enum e {Male, Female})); enum e * pe; 最后一个枚举常量后可以有逗号，这你应该服气： enum e { Sun, Moon,}; 不信你试试。   用存储类指定符register声明的bian liang有地址吗？？ register int r; int * pr = & r;    //可以？？？？？？ 这个void是亮点： void main ()  如果是 main () 还情有可原，因为默认是int

网易公开课有浙江大学老师开课，讲C语言。每周发布7天的课，由浅入深，很好

先了解什么是编程语言——http://zh.wikipedia.org/zh/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80 各个语言都有什么用途（大致） 然后选一门语言， 既然一无所知，那推荐找个视频看 比如学C，可以看看郝斌的

《汇编语言》 -- 王爽 第四版 我想，编程会算，有空还是出本书去

关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

文科妹子为啥要学编程呢？

跟我和赵老湿学吧，只是学费贵哩。朕贪财。


Question: 新手求大神来看看我的代码

引用 2 楼 iamshaofa 的回复:你听说过编程规范这个东西吗？你这种乱糟糟的代码你自己看得下去吗？请问？ http://www.afanihao.cn/c_guide/ ,附录《编码规范》 谢谢这个网站 对我很有用

引用 3 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢啊， 我去看看啊。 不过我后来发现问题了，我把判断的==写成=了。

引用 2 楼 iamshaofa 的回复:你听说过编程规范这个东西吗？你这种乱糟糟的代码你自己看得下去吗？请问？ http://www.afanihao.cn/c_guide/ ,附录《编码规范》 我感觉自己写的挺规范的只不过复制过来就是这样了。

引用 4 楼 iamshaofa 的回复:要是会调试也不会问这个问题了。。。  [quote=引用 3 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。[/quote] 难道我这个回复还不足够手把手教楼主调试？

要是会调试也不会问这个问题了。。。  引用 3 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

这是五子棋，新手写的相当烂。我检查输赢是：从下的那个棋子开始向左检查向右检查，直到遇到边界或者对手的棋子就结束，


Question: 新人求解 scanf在vs2012中没有执行

名字空间呢！

#include "stdio.h" 应为 #include <stdio.h>

将第4行删掉，然后重建所有。

关于代码，你试一下用scanf_s替换scanf函数，还有，新建工程的时候，不要勾选“预编译头”，要勾选“空项目”

引用 2 楼 tanqizhi 的回复:是头文件里加这个吗 是主函数源文件里加  #include <windows.h>

引用 3 楼 D_PCA 的回复:提示说了嘛，是上次成功的实例，当然不是这次的代码了。你的代码没有编译通过，运行的是上次成功编译的代码。  运行的是上次成功编译的代码

是头文件里加这个吗

Windows平台，为确保兼容性，一定要包含Windows.h


Question: 指针那一块的问题 缠着了

最后printf()中指示符类型与变量类型不符~~p为地址值~~%d显示整数型变量

引用 19 楼 my_live_123 的回复:2-是个常值不是常量 4-sizeof的结果是在编译时确定的，是从符号表中直接获取的常值，不是运行时确定的，sizeof s得到是数组的大小。类似p = s在运行时执行的。s的值就是基址。 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant 引用 21 楼 iamshaofa 的回复:这位兄弟说的很到位：sizeof是编译阶段干的事情，编译器是知道数组的大小的。  [quote=引用 19 楼 my_live_123 的回复:] 2-是个常值不是常量 4-sizeof的结果是在编译时确定的，是从符号表中直接获取的常值，不是运行时确定的，sizeof s得到是数组的大小。类似p = s在运行时执行的。s的值就是基址。 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant[/quote]  下次发言要先引用，要不然我不知道你们居然说了这么多话。 引用C标准中的条款，必须要注意的前提是你没有误读标准。 你加红的那句话，并不是说sizeof表达式在编译后不求值，它仅仅是说，求不求值，要分是不是涉及变量长度数组的情况：  void f (int n) {     int a [n];     printf ("%d\n", sizeof a); } 就这个例子而言，如果sizeof a的值是编译时确定，程序的结果还正确？？

求大牛总结。

引用 30 楼 qq_26036375 的回复:我也是醉了  本人  菜鸟一名 %s, 就是输出字符串, 从你指定的地址开始, 遇到\0结束

引用 30 楼 qq_26036375 的回复:我也是醉了  本人  菜鸟一名

我也是醉了  本人  菜鸟一名

你就是观点比较新奇，但从来不举证。  1. 我问你，你家的内存条是不是按小数寻址的，你不回答 2. 我问你，你家的字节不是8位，你不回答 3. 我问你，我这么书是C++的书，我在C++的书介绍bool类型，有问题吗？你不回答  你这是外星人啊？凌驾于地球人之上啊。

引用 15 楼 iamshaofa 的回复:1. 我的名字是《C/C++学习指南》，你对我起的名字有意见？ 2. 你真是什么都改说啊，你家的byte不是8位啊？这还要确定？你一边玩去吧。  [quote=引用 13 楼 sholber 的回复:] [quote=引用 12 楼 iamshaofa 的回复:] 别装，谢谢，指针不是整数是啥？是一根“针”吗？ pointer to an address 如何表达address呢，它不就是一个整数吗？你难道用一浮点数来表示address？你家的内存条还带小数寻址的？  没人说int赞同于int*，只是说“本质”上一样。有必要来扯构架来抬高自己的“视野”吗？  [quote=引用 11 楼 sholber 的回复:] [quote=引用 7 楼 xihu1364 的回复:] [quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？  [/quote]  引用 9 楼 ypzhong 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））[/quote]  1，可以明确地说，在有些架构上，指针无法用最长的整数类型容纳； 2，指针和整型不是一回事，别说指针是整数值。 3，指针强转整型，结果是C的实现决定的，而且可能用最长的整型也放不下。 这恐怕不是教条的问题了，是视野的问题。[/quote][/quote]    这是你写的书？ 1个字节只能是8位？？你确定？？ 悲催。[/quote][/quote]  这还只是随便一翻就发现的问题。 你保留你的1字节8位好了。随便你。

引用 14 楼 my_live_123 的回复:[quote=引用 2 楼 sholber 的回复:] [quote=引用 1 楼 my_live_123 的回复:] p = s，p的值是数组s的基地址 %s输出字符数组，遇到null结束输出  不知道大家为啥这么执著于“数组名”，这么说来，一个声明为int类型的标识符，也可以叫“整数名”或者“int名吧”。最奇葩的是数据名还能指向数组地址，一个名字还能指向地址，而且，是指向数组地址还是指向数组首元素的地址？（PS：因为函数类型的表达式叫函数指示符，人家是说“指示”一个函数，可没说指向一个函数，你这数组类型的表达式就直接指向地址了……C标准只是说指示数组类型的表达式不是可修改的左值，又说指示数组类型的表达式在某些条件下可以转换为指向其首元素的指针，可没说它会直接指向数组地址哇） 另外，如果s是数组名，那一个指示数组类型的表达式叫什么： struct t {char a [100];} t; t.a也是数组名吗？毕竟，s和t.a在表达式中可以互换。 指向“基地址”？&s是基地址还情有可原，但&s[0]也是基地址？我觉得基地址这个术语本身就够奇葩……请原谅``你撞枪口上了``早就对数组名这个奇葩不满了……[/quote]  1.数组类型的标示ID-s，这是我认为的”数组名“的含义。 2.数组的标示ID是个常值 3.基地址可以这样称呼，也可以称呼基址！也有称呼首地址的，只是翻译术语的区别。对address翻译成”地址“还是”址“呢？ 4.&s和s是等价的。&s,s,&s[0]的值相等，说基址是可以的，就看你怎么理解了 5.会原谅你的。交流才能出真知。[/quote]  2--常量里没有数组名； 4--sizeof s和s[0]++中的s不同，故&s和s未必等价。 数组名的意义是臆想出来的，我认为。

1. 我的名字是《C/C++学习指南》，你对我起的名字有意见？ 2. 你真是什么都改说啊，你家的byte不是8位啊？这还要确定？你一边玩去吧。  引用 13 楼 sholber 的回复:[quote=引用 12 楼 iamshaofa 的回复:] 别装，谢谢，指针不是整数是啥？是一根“针”吗？ pointer to an address 如何表达address呢，它不就是一个整数吗？你难道用一浮点数来表示address？你家的内存条还带小数寻址的？  没人说int赞同于int*，只是说“本质”上一样。有必要来扯构架来抬高自己的“视野”吗？  [quote=引用 11 楼 sholber 的回复:] [quote=引用 7 楼 xihu1364 的回复:] [quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？  [/quote]  引用 9 楼 ypzhong 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））[/quote]  1，可以明确地说，在有些架构上，指针无法用最长的整数类型容纳； 2，指针和整型不是一回事，别说指针是整数值。 3，指针强转整型，结果是C的实现决定的，而且可能用最长的整型也放不下。 这恐怕不是教条的问题了，是视野的问题。[/quote][/quote]    这是你写的书？ 1个字节只能是8位？？你确定？？ 悲催。[/quote]

引用 2 楼 sholber 的回复:[quote=引用 1 楼 my_live_123 的回复:] p = s，p的值是数组s的基地址 %s输出字符数组，遇到null结束输出  不知道大家为啥这么执著于“数组名”，这么说来，一个声明为int类型的标识符，也可以叫“整数名”或者“int名吧”。最奇葩的是数据名还能指向数组地址，一个名字还能指向地址，而且，是指向数组地址还是指向数组首元素的地址？（PS：因为函数类型的表达式叫函数指示符，人家是说“指示”一个函数，可没说指向一个函数，你这数组类型的表达式就直接指向地址了……C标准只是说指示数组类型的表达式不是可修改的左值，又说指示数组类型的表达式在某些条件下可以转换为指向其首元素的指针，可没说它会直接指向数组地址哇） 另外，如果s是数组名，那一个指示数组类型的表达式叫什么： struct t {char a [100];} t; t.a也是数组名吗？毕竟，s和t.a在表达式中可以互换。 指向“基地址”？&s是基地址还情有可原，但&s[0]也是基地址？我觉得基地址这个术语本身就够奇葩……请原谅``你撞枪口上了``早就对数组名这个奇葩不满了……[/quote]  1.数组类型的标示ID-s，这是我认为的”数组名“的含义。 2.数组的标示ID是个常值 3.基地址可以这样称呼，也可以称呼基址！也有称呼首地址的，只是翻译术语的区别。对address翻译成”地址“还是”址“呢？ 4.&s和s是等价的。&s,s,&s[0]的值相等，说基址是可以的，就看你怎么理解了 5.会原谅你的。交流才能出真知。

引用 12 楼 iamshaofa 的回复:别装，谢谢，指针不是整数是啥？是一根“针”吗？ pointer to an address 如何表达address呢，它不就是一个整数吗？你难道用一浮点数来表示address？你家的内存条还带小数寻址的？  没人说int赞同于int*，只是说“本质”上一样。有必要来扯构架来抬高自己的“视野”吗？  [quote=引用 11 楼 sholber 的回复:] [quote=引用 7 楼 xihu1364 的回复:] [quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？  [/quote]  引用 9 楼 ypzhong 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））[/quote]  1，可以明确地说，在有些架构上，指针无法用最长的整数类型容纳； 2，指针和整型不是一回事，别说指针是整数值。 3，指针强转整型，结果是C的实现决定的，而且可能用最长的整型也放不下。 这恐怕不是教条的问题了，是视野的问题。[/quote][/quote]    这是你写的书？ 1个字节只能是8位？？你确定？？ 悲催。

别装，谢谢，指针不是整数是啥？是一根“针”吗？ pointer to an address 如何表达address呢，它不就是一个整数吗？你难道用一浮点数来表示address？你家的内存条还带小数寻址的？  没人说int赞同于int*，只是说“本质”上一样。有必要来扯构架来抬高自己的“视野”吗？  引用 11 楼 sholber 的回复:[quote=引用 7 楼 xihu1364 的回复:] [quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？  [/quote]  引用 9 楼 ypzhong 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））[/quote]  1，可以明确地说，在有些架构上，指针无法用最长的整数类型容纳； 2，指针和整型不是一回事，别说指针是整数值。 3，指针强转整型，结果是C的实现决定的，而且可能用最长的整型也放不下。 这恐怕不是教条的问题了，是视野的问题。[/quote]

引用 7 楼 xihu1364 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？  [/quote]  引用 9 楼 ypzhong 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））[/quote]  1，可以明确地说，在有些架构上，指针无法用最长的整数类型容纳； 2，指针和整型不是一回事，别说指针是整数值。 3，指针强转整型，结果是C的实现决定的，而且可能用最长的整型也放不下。 这恐怕不是教条的问题了，是视野的问题。

是他用的书太烂，不怪他。新手如果拿谭浩强的书来看，那绝对是废了，不过这书基本上是垄断了高校市场，可悲。

引用 6 楼 sholber 的回复:[quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote] 计算机里所有东西表示都是0 1，这些东西给他加上人为的意义，才是这些01的意义，如果把指针强转(int)那他就是整数值有什么错，灵活应用知识，学习不要太教条。（你惊讶不过是他不符合你的教条（c标准））

是什么证据啊？  int  m = 10; int* pm = & m; printf("%08X ", pm); printf("%d", pm); printf("%d", &m);  指针就是一个拐钮的叫法，它就是一个内存地址，你有一个1G的内存，每个单元都有一个编号，编号就是地址。不用谢了。我是来宣传我的书的： http://www.afanihao.cn/c_guide/  ，一看就懂。   引用 6 楼 sholber 的回复:[quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]

引用 6 楼 sholber 的回复:[quote=引用 4 楼 iamshaofa 的回复:] 指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？[/quote]  指针的大小就是4个字节，不就是一个int的大小吗？

引用 4 楼 iamshaofa 的回复:指针就是一个整数值，和int是没有本质区别的。  int  a ; int  b ; a = b; 你懂吧？  PINT  pa = &n; PINT  pb = &m; pa = pb; 你不会不懂吧？  PINT就是int*，就是一种写法。 typedef int*  PINT; OK，你以后就用PINT就明白了。  《C/C++学习指针》，第9章，指针，一看就懂。http://www.afanihao.cn/c_guide/  。不要直接看第9章，谢谢。你得先看第3章和第4章，有铺垫的。  指针是整数值？？真令人惊讶！证据？？


Question: 关于变量作用域的问题

那不可能滴  求贴代码图和程序运行图

引用 楼主 a130098300 的回复:代码大致如下  int val_1 = 0; int val_2 = 0;  static void func(  ) {    val_1++;    val_2++; }  static int func2() {     return val_1 / val_2; }  int main() {     for(  i=0; i < 10; i++ )     {        func();     }     func2(); }  现在的问题只这样的，下断点每次进入func，发现变量val_1,val_2都会自增1（第一次进入循环体，自增前都为0，第二次都为1），但是跳出func()之后，val_1,val_2又会变成0。导致循环结束后，调用func2挂掉，除0错误，请问这是怎么回事，求解！  肿么可能，可是全局变量哦

#include <iostream> using namespace std;  int val_1 = 0; int val_2 = 0;  static void func(  ) {    val_1++;    val_2++;    cout << "func :" << val_1 << ", " << val_2 <<endl; }  static int func2() {     return val_1 / val_2; }  int main() {     for(int i=0; i < 10; i++ )     {        func();        cout << val_1 << ", " << val_2 <<endl;     }     cout << func2() << endl;     return 0; }

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 用C查找网页中内容

libcurl + regex.h

我这里有Windows平台很好的搜索引擎，完成了80%

利用curl库，爬虫技术，把网页内容读取进行分析出自己想要的内容！

使用curl库？


Question: 急求坐等

#define SWAP(a,b)  ((a)=(a)^(b),(b) = (a)^(b),(a) = (a)^(b))


Question: #define与typedef用法的区别

楼主，你是哪个大学的？

VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

int *p3,p4;-->可以这么定义，p4不是指针。

#define PCHAR char*  宏定义是代码替换.   所以替换后 PCHAR p3,p4;   等价于   char*  p3, p4;    又因为*号是跟最近变量结合.    可以这样写:    char   *p3, p4;     所以 p3是一个char指针,  p4是一个char变量. 在实际的工作中, 是需要避免这种写法的.  而typedef char* pchar;  是定义了一种类型的别名,  不是代码替换. 所以p1,p2都是char*

引用 8 楼 sholber 的回复:楼主，你是哪个大学的？昨晚上，把我搞蒙了，现在一看，发现我都接触过的

引用 8 楼 sholber 的回复:楼主，你是哪个大学的？一个普通二本，我大学里C语言没有系统学过，之后都是工作中学的，现在准备重新把这些东西过一遍

引用 1 楼 user-8 的回复:char *p3,p4,这个定义了一个指向char型的指针p3,和一个char变量p4 宏定义是简单的字符替换，typedef是定义一种变量类型的别名 宏定义是简单的字符替换，typedef是定义一种变量类型的别名

typedef类似于struct，是定义一个新类型，define是简单的替换

恩  楼上说的对，宏定义是简单的字符替换，typedef是定义一种变量类型的别名 这里的关键是  用char*替换PCHAR p3,p4;中的PCHAR后得到的这句char* p3,p4;该怎么理解，这个可以理解为p3,p4都是指针（把char*看做一种数据类型）也可以把p3看做指p4看做普通的char变量（即理解为char *p3,p4），那VC到底是怎么”理解“的呢？根据实验可知vc的理解是后一种理解，即你写char* p3,p4或者char *p3,p4都是一样的，vc都是默认p3是指针，p4是char的普通变量。但如果你就想一次定义多个指针呢，那就只能用typedefine来解决了  希望帮到你