Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教一个c栈程序的问题

回复:
user: user-1
content: 引用 2 楼 qq_21747999 的回复:[quote=引用 1 楼 u010231493 的回复:] #define MD（a）a<<2这是一个宏。 首先我们按照宏替换的原则来看。。结果如下: MD(1)----->1<<2   再来看1<<2  。<<是按位运算符，百度即可。 1的二进制是1，进行按位运算就是1向左移动俩位，就是100（二进制）     ；然而100刚好是4 那MD是什么意思呢，是个函数？[/quote]  恩，是个宏，宏的作用是替换就成了我上面说的那样了。楼主可以多百度看看宏的用法。好了，谢谢！给分。

user: user-2
content: 带参数的宏，类似于函数

user: user-3
content: MD不就是个宏定义吗？ 1<<2 不就是1左移两位，是4了吗？ 楼主基础很差啊

user: user-0
content: 引用 1 楼 u010231493 的回复:#define MD（a）a<<2这是一个宏。 首先我们按照宏替换的原则来看。。结果如下: MD(1)----->1<<2   再来看1<<2  。<<是按位运算符，百度即可。 1的二进制是1，进行按位运算就是1向左移动俩位，就是100（二进制）     ；然而100刚好是4 那MD是什么意思呢，是个函数？

user: user-1
content: #define MD（a）a<<2这是一个宏。 首先我们按照宏替换的原则来看。。结果如下: MD(1)----->1<<2   再来看1<<2  。<<是按位运算符，百度即可。 1的二进制是1，进行按位运算就是1向左移动俩位，就是100（二进制）     ；然而100刚好是4
user-0 提问: 结构体数组为何要在声明时定义

回复:
user: user-1
content: a[50] = a[temp]; 越界了

user: user-2
content: struct Student  {      int num;       char name[20];        float score;       int age;  }; 这样定义后，使用是需要struct Student student [ 50]; 也就是说变量声明需用struct 结构体名 变量名。  改成 typedef struct Student {     int num;      char name[20];       float score;      int age; }Student; 就没有上面问题了

user: user-3
content: 另一种方法：  typedef struct Student {     int num;      char name[20];       float score;      int age; }Student; Student a[50];

user: user-4
content: 1.越界  2.定义位置不同，越界造成的后果不同。  struct Student a[50]; 这是局部变量，越界访问影响到函数体。  struct Student {     int num;      char name[20];       float score;      int age; }a[50];  这是全局变量，越界访问未影响到函数体，会造成未知后果。

user: user-3
content: 26行明显越界~

user: user-5
content: 引用 5 楼 ZipperLin 的回复:[quote=引用 3 楼 ahacsdn 的回复:] struct Student a[50]; 那么 a 的范围是 a[0]-a[49]; 你排序的时候用a[50]做临时变量导致了越界。 你在声明了 a[50] 后，紧接着的声明： int temp, sum, num, times; 这样 a[50] 所在的这块内存其实是这几个变量所在的内存区域，排序时由于给 a[50]  做了赋值，导致该内存区域中 temp和time的值改变，并未按照你的意愿在 for 循环中递增。  如果在结构声明后紧接着声明 a[50]  ，两处内存就不是连在一起的，程序就正常跑了。 也不能说正常吧，越界总是危险的。为什么排序时由于给 a[50]  做了赋值，会导致该内存区域中 temp和time的值改变?我调试的时候是正常的[/quote]   你把这几个变量的地址输出一下看看：

user: user-6
content: 引用 6 楼 hshshaaa 的回复:  即便改成在结构体声明那里，也会报错。估计是编译器没有识别吧。我用的xcode，都会提示a[50]超过数组所包含的50个元素了。 我记得书上有这么一句话“系统不会检测数组元素的下标是否越界，编程时，必须保证数组下标不能越界”，这就能解释为什么编译没出问题，运行时出问题了。可能这是针对老一点的编程软件吧。

user: user-6
content: 即便改成在结构体声明那里，也会报错。估计是编译器没有识别吧。我用的xcode，都会提示a[50]超过数组所包含的50个元素了。

user: user-0
content: 引用 3 楼 ahacsdn 的回复:struct Student a[50]; 那么 a 的范围是 a[0]-a[49]; 你排序的时候用a[50]做临时变量导致了越界。 你在声明了 a[50] 后，紧接着的声明： int temp, sum, num, times; 这样 a[50] 所在的这块内存其实是这几个变量所在的内存区域，排序时由于给 a[50]  做了赋值，导致该内存区域中 temp和time的值改变，并未按照你的意愿在 for 循环中递增。  如果在结构声明后紧接着声明 a[50]  ，两处内存就不是连在一起的，程序就正常跑了。 也不能说正常吧，越界总是危险的。为什么排序时由于给 a[50]  做了赋值，会导致该内存区域中 temp和time的值改变?我调试的时候是正常的

user: user-5
content: 也不知道对不对，共同学习啊

user: user-5
content: struct Student a[50]; 那么 a 的范围是 a[0]-a[49]; 你排序的时候用a[50]做临时变量导致了越界。 你在声明了 a[50] 后，紧接着的声明： int temp, sum, num, times; 这样 a[50] 所在的这块内存其实是这几个变量所在的内存区域，排序时由于给 a[50]  做了赋值，导致该内存区域中 temp和time的值改变，并未按照你的意愿在 for 循环中递增。  如果在结构声明后紧接着声明 a[50]  ，两处内存就不是连在一起的，程序就正常跑了。 也不能说正常吧，越界总是危险的。

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:另一种方法：  typedef struct Student {     int num;      char name[20];       float score;      int age; }Student; Student a[50]; 问题是为什么第一种会错误
user-0 提问: 译密码

回复:
user: user-1
content: 相减取余

user: user-2
content: char*str = "ABCDE"; char* p = str; while(*p)     *p = *p + 4;

user: user-3
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:while((ch=getchar())!=EOF)         if(isupper(ch)) putchar((ch-'A'+4)%26+'A');    EOF   isupper 这俩个是什么意思

user: user-4
content: while((ch=getchar())!=EOF)         if(isupper(ch)) putchar((ch-'A'+4)%26+'A');

user: user-5
content: 用进制可以实现，，，，
user-0 提问: 做个统计空格数的程序，为什么总数打印不出来

回复:
user: user-1
content: 使用楼上的的输入，程序是没有问题的~

user: user-2
content: Linux:Ctrl+D Windows:Enter,Ctrl+Z,Enter

user: user-3
content: while(c!=EOF)     //c一直不等于EOF一直循环

user: user-4
content: 程序没有问题。  运行的时候，输入Ctrl+Z就可以跳出循环了。

user: user-5
content: win : Ctrl+D linux: Ctrl+Z

user: user-0
content: 为什么c一直不等于EOF啊？

user: user-6
content: EOF不是文件末尾吗...本人傻，说错勿喷

user: user-7
content: 在windows下，按回车，ctrl+z，回车，就输入EOF了
user-0 提问: 在书上看到的一个非递归后序遍历二叉树的算法，求思路讲解，而且这段代码运行不了····

回复:
user: user-0
content: 不要沉呀！求大神！！！！

user: user-0
content: 为什么会一直提示q未初始化

user: user-1
content: 遍历二叉树 http://blog.csdn.net/zhangxiangdavaid/article/details/37115355
user-0 提问: 100分求一数组元素位置标记算法，请高手赐教

回复:
user: user-1
content: B[m,n]个头指针节点，和B[m,n]个整数存储点[m,n]数值为1的年数。//结构体1 year节点int型村具体的年份，next指针节点存下一个满足条件的年份。 //结构体2

user: user-0
content: 现在最希望使用一个二维数组就能满足标记位置的算法，而且我的现在的开发平台，对数组都是整体操作的，类似matlab一样，比如找小于0的元素，直接就是B=A<0即可（B值即为0或1），使用结构体不是很方便。
user-0 提问: 顺序表求解！！！（我要实现插入删除计字符数，程序没有错，但不能实现我想要的功能）

回复:
user: user-1
content: 至少  	k = strlen(Data); 	//for (k = 0; k < 1024; k++) 	//{ 	//	if (Data[k] != '!') 	//		continue; 	//	else 	//		break; 	//}  当然，还有其它问题~

user: user-2
content: puts(Data) gets(Data) 这个怎么编过去的
user-0 提问: [求助帖]我想编一个程序，谁帮我一下

回复:
user: user-1
content: 引用 3 楼 gwbzx 的回复:#include<stdio.h> int main(void) { system("shutdown -s -t 0");  return 0; } 运行即可! 大忽悠~

user: user-2
content: #include<stdio.h> int main(void) { system("shutdown -s -t 0");  return 0; } 运行即可!

user: user-3
content: 搜“网络爬虫 源代码”

user: user-4
content: http://so.csdn.net/so/search/s.do?q=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB+&t=code&o=&s=

user: user-5
content: 写个爬虫呗，会点http和socket 和正则就行了，当然你想整复杂的也行
user-0 提问: 段错误

回复:
user: user-1
content: 先输出"aaaa,"，然后是出错。

user: user-2
content: 引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  教坏小盆友

user: user-3
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-4
content: 引用 2 楼 u010424970 的回复:看错了，因是先执行第五行，输入aaaa,然后出现段错误。所以选C 我看也是

user: user-5
content: 看错了，因是先执行第五行，输入aaaa,然后出现段错误。所以选C

user: user-5
content: A 在我现在了解的，有以下： char *s="aaaa";，这里，s会是一个不能变的char*型常数指针，相应的引用s的地方，应该都是变成了固定的地址值了，它指向一个固定的地址，就是字符串"aaaa"的首地址，然后，像这种定义的字符串，是不能改变的，因为它在编译后，值保存在代码段，代码段的内存页是没有写权限。 另一个偏点的信息就是，只有使用像bash这样的shell才会提示：段错误。个别久远的shell直接死进程不提示信息，比如我们在IA32系统里，运行bash编写代码，会有提示，但是嵌入式里的sh,使用的是/bin/sh命令，它是不提示信息错误信息的。这个信息请看linux的信息机制。
user-0 提问: vc++6.0中strcpy函数越界的相关问题

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 具体你要看汇编代码，看函数运行后是返回到哪条指令，把那条指令覆盖成你的函数地址 另外用Release版，因为Debug会去检查是否栈平衡等可能会提示错误，我发那个在VC6下可以运行显示“I'm Come In!!!” 具体楼主也不用纠结，知道有这么回事就行

user: user-0
content: 引用 9 楼 LIGHTSWORNLEIHAO 的回复:[quote=引用 3 楼 paschen 的回复:] 地址你可能没搞对，参看这个：   void fun() { 	printf("I'm Come In!!!"); }  int main() { 	int array[1] = {1}; 	array[2] = (unsigned int)fun; 	return 0; }    这也是 缓冲区溢出攻击基本原理这个不行，实测是array【6】。我估计是1占个位置，、0占个位置，ebp四个位置[/quote而且这个在我把数组类型变成char后不管用了，不管最后那个array【】]方括号里是几

user: user-0
content: 引用 3 楼 paschen 的回复:地址你可能没搞对，参看这个：   void fun() { 	printf("I'm Come In!!!"); }  int main() { 	int array[1] = {1}; 	array[2] = (unsigned int)fun; 	return 0; }    这也是 缓冲区溢出攻击基本原理这个不行，实测是array【6】。我估计是1占个位置，、0占个位置，ebp四个位置

user: user-3
content: 引用 1 楼 LIGHTSWORNLEIHAO 的回复:另外c语言堆栈结构的书大家能不能推荐几本 数据结构： 毛遂自荐下：http://blog.csdn.net/zhangxiangdavaid/article/details/25082013

user: user-0
content: 引用 4 楼 zhangxiangDavaid 的回复:[quote=引用 1 楼 LIGHTSWORNLEIHAO 的回复:] 另外c语言堆栈结构的书大家能不能推荐几本 “堆栈结构”~，你是说“数据结构”吧！[/quote]我可能理解错了，堆栈和链表好像就是数据结构的内容。

user: user-0
content: 引用 3 楼 paschen 的回复:地址你可能没搞对，参看这个：   void fun() { 	printf("I'm Come In!!!"); }  int main() { 	int array[1] = {1}; 	array[2] = (unsigned int)fun; 	return 0; }    这也是 缓冲区溢出攻击基本原理谢谢，我现在去试试。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）谢谢老师，学习了。

user: user-3
content: 引用 1 楼 LIGHTSWORNLEIHAO 的回复:另外c语言堆栈结构的书大家能不能推荐几本 “堆栈结构”~，你是说“数据结构”吧！

user: user-2
content: 地址你可能没搞对，参看这个：   void fun() { 	printf("I'm Come In!!!"); }  int main() { 	int array[1] = {1}; 	array[2] = (unsigned int)fun; 	return 0; }    这也是 缓冲区溢出攻击基本原理

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 另外c语言堆栈结构的书大家能不能推荐几本
user-0 提问: 请问，C语言一个被调用函数可不可以有两个return语句，该怎么使用第二个返回的值呢？

回复:
user: user-1
content: 不可以，一个函数只能有一个返回值

user: user-2
content: 可以作为参数传递，c/c++ return后面都是只返回一个对象 或者返回一个空的 例如 return； 如果想要返回多个可以考虑传参    另外像Matlab这种代码就可以返回多个值

user: user-0
content: 求高手来指点
user-0 提问: C语言右移结果出错？

回复:
user: user-1
content: 从结果来说，这个结果是完全正确的，并没有任何错误。 你的rsNum在掩码处理后的值为50331648，右移21位就好比除以2的21次方，你用计算器试下，结果就是24.

user: user-2
content: 仅供参考：#include <stdio.h> unsigned short int ui;   signed short int si; int main() {     ui=(unsigned short int)0x8000u;     si=(  signed short int)0x8000;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui>>1;     si=si>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned short int)0x8000u;     si=(  signed short int)0x8000;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed short int)ui)>>1;     si=((unsigned short int)si)>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      return 0; } //ui=32768 //si=-32768 //ui=16384 //si=-16384 //-------------- //ui=32768 //si=-32768 //ui=49152 //si=16384
user-0 提问: linker command failed with exit code 1 (use -v to see invocation)问题

回复:
user: user-1
content: 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。

user: user-2
content: 请贴出编译器完整的输出。

user: user-0
user-0 提问: winsocket编程

回复:
user: user-1
content: 可参考：http://bbs.csdn.net/topics/330006557

user: user-1
content: 将wsock32.dll复制到你生成程序的文件夹下。

user: user-2
content: 没有lib文件的意思吗，用LoadLibrary

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:什么意思？这个主要看你喜欢~

user: user-3
content: 什么意思？这个主要看你喜欢~
user-0 提问: 新手问题，求大牛高抬贵手

回复:
user: user-1
content: 如果if块中有个return，如果满足if，函数就返回了，否则会继续调用该函数，这样就一直不会结束，直到程序栈空间不够而崩溃。。

user: user-2
content: IF是条件判断语句 没有IF则陷入了另外一个条件 自然就出现另外一个模式  自然就意外了 看来你是盲人摸象啊

user: user-3
content: 1、递归是需要退出条件的。  2、VS下单步跟踪，看的最详细。

user: user-4
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-5
content: 因为你的这个函数会一直调用自己！永远不会停止！

user: user-6
content: 楼主你好，这个是函数的递归调用，s1函数的调用了自身a次（算第一次本身在内），所以其意义是输出a个Smile!，函数定义中是int s1，意味着应返回一个整数值，如果没有if，则函数不会有返回值从而陷入无尽循环……有了if后到调用到s1(1)时就会执行换行并返回0，返回值的地方就是函数终止的地方，所以后面没有继续输出了

user: user-7
content: 递归调用至少需要有个退出的地方, 如果没有if那句话, lz可以试试手动模拟一下程序执行, 会发现一直循环, 加了这句话, 就在a等于1的时候打破该循环, 退出函数调用链了.
user-0 提问: 问题求助

回复:
user: user-1
content: 三角形: #include <stdio.h> int main (void) { 	int i,j; 	for(i = 0 ; i < 7 ; i++) 	{ 		for(j = 0 ; j <= i ; j++) 		{ 			printf("*"); 		} 		printf("\n"); 	} 	for(i = 5 ; i >= 0 ; i--) 	{ 		for(j = 0 ; j <= i ; j++) 		{ 			printf("*"); 		} 		printf("\n"); 	}  	return 1; }

user: user-1
content: 下一问代码:  #include <stdio.h> #define ABS(a,b) (a>b?a-b:b-a) int main (void) { 	int i,j; 	for(i = 1 ; i < 2*7 ; i++) 	{ 		for(j = 1 ; j < 2*7 ;j >= 1 + ABS(i,7) && j <= 13 - ABS(i,7) ? printf("*") : printf(" "),j++); 		printf("\n"); 	} 	 	return 1; }

user: user-1
content: 另一种方法:  #include <stdio.h> #define ABS(a,b) (a>b?a-b:b-a) int main (void) { 	int i,j; 	 	for(i = 1 ; i < 2*7 ; i++) 	{ 		for(j = 1 ; j <= 7-ABS(i,7) ; j++) 		{ 			printf("*"); 		} 		printf("\n"); 	}  	return 1; }

user: user-0
content: 还有这个用循环怎么写？求助       *      ***     *****    *******   *********  *********** *************  ***********   *********    *******     *****      ***       *
user-0 提问: linux下C的网络编程题？

回复:
user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-2
content: 1. 如果客户端和服务器端所使用的整数的大小端是相同的，直接发送就行了.     int x;     send(cs, (char*)&x, 4, 0)     recv(cs, (char*)&x, 4, 0)  2. 如果传输过程中网络连接没有断开，TCP 就保证了你的数据是完整的。     如果连接有问题中途出错了，你需要的是断点续传了

user: user-0
content: 快来人啊。。。。。。。
user-0 提问: 题目在图片上 蛮简单的一道题 可提交上去怎么总是错的！！！求大神指导！

回复:
user: user-1
content: 纸上学来终觉浅，绝知此事要躬行。

user: user-2
content: 已经溢出了吧

user: user-3
content: 给你组测试数据：2 2 0 0

user: user-4
content: 是一次多个输入  #include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct _input { 	int heads; 	int legs; 	struct _input *next; }input_t; //////////////////////////////////////  void calc_result(int heads, int legs) { 	int rabbit;  	int pigeon;  	 	pigeon = (4 * heads - legs) / 2;  	rabbit = heads - pigeon;  	  	if ((pigeon * 2 + rabbit * 4) != legs)  	{  		printf("Error\n"); 	} 	else 	{ 		printf("%d %d\n", pigeon, rabbit); 	}	 } ///////////////////////////////////////////////  int main(void)  {  	int heads = 0; 	int legs = 0; 	input_t* store, *tmp1, *tmp2; 	 	store = calloc(sizeof(input_t), 1); //link table empty header 	tmp2 = store; 	 	//get input 	while (1) 	{ 		scanf("%d %d", &heads, &legs); 		if ((0 == heads) && (legs == 0)) 		{ 			break; 		} 		tmp1 = (input_t*)malloc(sizeof(input_t)); 		tmp1->heads = heads; 		tmp1->legs = legs; 		tmp1->next = NULL; 		tmp2->next = tmp1; 		tmp2 = tmp1; 	}   	//proc input  	tmp2 = store->next;  	while (tmp2 != NULL)  	{  		calc_result(tmp2->heads, tmp2->legs);  		tmp1 = tmp2;  		tmp2 = tmp2->next;  		free(tmp1); 	} 	 	free(store);    }

user: user-5
content: 这不是解方程，怎么搞这么复杂

user: user-6
content: int  改成 long long %d 改成 %lld

user: user-7
content: 是，看错了，你写了判断，那应该是别的问题了

user: user-7
content: 输入改成 while(scanf("%d %d",&n,&m)！=EOF)  {       ..... }

user: user-8
content: 题目要求一次输入多组数据，输完数据后才输出结果，你的一次只能输入一组数据，用链表结构试试

user: user-9
content: m、n最大能到2的30次方 你的算式中出现了4乘以n，这个数超出了int的范围，溢出了 变化一下，把 (4*n-m)/2 变成 n*2-m/2 试试
user-0 提问: 函数返回一个int参数打开的位的数量

回复:
user: user-1
content: 显然是在统计int二进制位上1的个数~ 下面的这个方法，效率更高：  int countOne(int a) { 	int count = 0; 	while (a) 	{ 		count++; 		a = a&(a - 1); 	} 	return count; }

user: user-2
content: while(a/2)                        //a被2整除  整数部分不为零则执行。     {         count+=a%2;          //count = count + a被2整除的余数         a=a>>1;                   //a右移一位    等价于a = a / 2     }

user: user-3
content: 计算a的二进制表示中的1的个数 while的条件实际上是a大于1 循环体中将a最低位加到count中，然后a除以2 循环后再将a小于或等于1中等于1时的一位加进来
user-0 提问: MPI环境变量问题，新人求解

回复:
user: user-1
content: 用depends.exe查看exe依赖的dll及其版本号。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:设置该exe的属性为以管理员身份运行。 能再说明白一点吗，我试了一下管理员运行，结果闪退了。生成的可执行文件不是应该用控制台实现的吗，那要怎么设置管理员运行呢

user: user-1
content: 设置该exe的属性为以管理员身份运行。
user-0 提问: 后缀表达式转换为中缀表达式问题

回复:
user: user-0
content: 第一次用csdn，还完全不熟悉规则多包涵

user: user-1
content: 楼主，为了提高别人回答你的可能性，我觉得你可以 用CSDN发帖的代码格式，代码部分的显示格式会更清晰易懂
user-0 提问: 扔一个的渣渣NES模拟器

回复:
user: user-0
content: 引用 8 楼 mLee79 的回复:就 NES 那还不到 QVGA 的分辨率, 用啥都慢不了啊, 我在 Tegra2 的板子上跑测试都刷了 200+fps ..  因为以后会逐渐开这种窗口，这种扩展辅助的窗口我觉得才是真正有意思的地方。

user: user-1
content: 就 NES 那还不到 QVGA 的分辨率, 用啥都慢不了啊, 我在 Tegra2 的板子上跑测试都刷了 200+fps ..

user: user-0
content: 引用 5 楼 mLee79 的回复:用啥引擎的, infoNES 么,以前我弄了个跑 ARM 上. 这东西有必要用 DDraw, D3D 么, 我用 GDI 画, 在我本子上也能跑 400+ fps. 这个渣渣例程速度还凑合，每帧时间片没跑偏的情况下1ms都没用到，我在考虑怎么用剩下的时间做更多有用的事情，(比如Filter滤波，自绘PPU状态图UI，寄存器观察图表，这几个窗口基本设想都是要占大半个屏幕的)，这种东西以后会有很多，不用direct很难想象帧数。即使是原始的dx9 surface 在LOCK_BUFFER + SSE movdqa 在全屏写入的时候要比GDI快上 5~6倍左右。要是用GDI，估计会惨不忍睹(主显示屏幕使用GDI还蛮强凑合我想。。。。至于你说的infoNES，没有用过我是看了模拟器源代码写出来的(或多或少点virtuanes/nesterj的影子0_0)

user: user-0
content: 引用 4 楼 dustpg 的回复:[quote=引用 3 楼 u013550545 的回复:] [quote=引用 2 楼 dustpg 的回复:] 前排占座， 自己也写了个, 5个月没更新了, 只完成了指令模拟。 话说C语言用COM组件会不会很麻烦啊.dx头文件有个简化调用的宏可以隐藏vtbl调用。。其余的就是多传一个this指针的事情了。dx到了xact之前版本的header都会保留这组宏,全是用c源文件编译的。倒不是闲的蛋疼。pc机配置低不给力。cpp编译速度太慢了，本身vs就卡。里面的cpu是用汇编写的。ppu也不难。ppu有两种模拟方式一种是粗浅的模拟ntsc下约113 cycles画一帧线 240根时候提交渲染，之后就是vblank和nmi中段处理。另外一种是根据ppu的具体周期来写精灵读nt at等这种方法比较难理解速度也慢但是模拟精度高。apu和mapper都没怎么看。。整个过程最让我意外的就是以jit方式模拟的nes在全屏下使用gdi渲染的时候也很流畅 。[/quote]   编译速度倒是没什么，因为核心没用第三方库, 标准库也是仅仅几个必要的, 编译速度哧溜溜的和hello world一样.  因为目标是跨平台所以到是没用汇编. 唉, 说得我又想继续搞了, 挖坑太多了[/quote]neswiki上面有很多资料，国内基本折腾这些东西的人还在少数

user: user-1
content: 用啥引擎的, infoNES 么,以前我弄了个跑 ARM 上. 这东西有必要用 DDraw, D3D 么, 我用 GDI 画, 在我本子上也能跑 400+ fps.

user: user-2
content: 引用 3 楼 u013550545 的回复:[quote=引用 2 楼 dustpg 的回复:] 前排占座， 自己也写了个, 5个月没更新了, 只完成了指令模拟。 话说C语言用COM组件会不会很麻烦啊.dx头文件有个简化调用的宏可以隐藏vtbl调用。。其余的就是多传一个this指针的事情了。dx到了xact之前版本的header都会保留这组宏,全是用c源文件编译的。倒不是闲的蛋疼。pc机配置低不给力。cpp编译速度太慢了，本身vs就卡。里面的cpu是用汇编写的。ppu也不难。ppu有两种模拟方式一种是粗浅的模拟ntsc下约113 cycles画一帧线 240根时候提交渲染，之后就是vblank和nmi中段处理。另外一种是根据ppu的具体周期来写精灵读nt at等这种方法比较难理解速度也慢但是模拟精度高。apu和mapper都没怎么看。。整个过程最让我意外的就是以jit方式模拟的nes在全屏下使用gdi渲染的时候也很流畅 。[/quote]   编译速度倒是没什么，因为核心没用第三方库, 标准库也是仅仅几个必要的, 编译速度哧溜溜的和hello world一样.  因为目标是跨平台所以到是没用汇编. 唉, 说得我又想继续搞了, 挖坑太多了

user: user-3
content: 引用 8 楼 mLee79 的回复:就 NES 那还不到 QVGA 的分辨率, 用啥都慢不了啊, 我在 Tegra2 的板子上跑测试都刷了 200+fps ..  http://bbs.csdn.net/topics/391846638  高手帮忙看看帖子，多谢

user: user-0
content: 引用 2 楼 dustpg 的回复:前排占座， 自己也写了个, 5个月没更新了, 只完成了指令模拟。 话说C语言用COM组件会不会很麻烦啊.dx头文件有个简化调用的宏可以隐藏vtbl调用。。其余的就是多传一个this指针的事情了。dx到了xact之前版本的header都会保留这组宏,全是用c源文件编译的。倒不是闲的蛋疼。pc机配置低不给力。cpp编译速度太慢了，本身vs就卡。里面的cpu是用汇编写的。ppu也不难。ppu有两种模拟方式一种是粗浅的模拟ntsc下约113 cycles画一帧线 240根时候提交渲染，之后就是vblank和nmi中段处理。另外一种是根据ppu的具体周期来写精灵读nt at等这种方法比较难理解速度也慢但是模拟精度高。apu和mapper都没怎么看。。整个过程最让我意外的就是以jit方式模拟的nes在全屏下使用gdi渲染的时候也很流畅 。

user: user-2
content: 前排占座， 自己也写了个, 5个月没更新了, 只完成了指令模拟。 话说C语言用COM组件会不会很麻烦啊.

user: user-0
content: http://download.csdn.net/detail/u013550545/9208049米娜来接分吧~~~
user-0 提问: 【求助】数组中n个相邻数累加算法

回复:
user: user-1
content: 我也来凑热闹，除了while循环加了个printf方便看到运算过程和结果。   void formatInfo(int n, char* pInfo) { 	if(NULL == pInfo) return;  	char cFactor = (n%2 == 1 ? '+':'-');  	if(n > 1) 	{ 		sprintf(pInfo+strlen(pInfo), " %c ", cFactor); 	} 	sprintf(pInfo+strlen(pInfo), "%d", n); }  int sum(int nEnd, char* pInfo) { 	int s = 0; 	int n = 1; 	while( n <= nEnd ) 	{ 		int factor = ( 1 == n%2 ? 1 : (-1) ); 		s += n*factor;  		formatInfo(n, pInfo);  		n++; 	}  	sprintf(pInfo+strlen(pInfo), " = %d", s); 	return s; }  int _tmain(int argc, _TCHAR* argv[]) { 	char info[1000]; 	memset(info, 0, sizeof(info)); 	int s = sum(5, info); 	printf("%s\r\n", info); }   输出结果： 1 - 2 + 3 - 4 + 5 = 3

user: user-2
content: 同意楼上的~

user: user-3
content: #include <stdio.h> int main() {     const int n=6;     int d[n]={1,2,3,4,5,6};     int L,F,sum,i;      for (L=2;L<=n;L++) {         printf("----%d----\n",L);         for (F=0;F<=n-L;F++) {             sum=d[F];printf("%d",d[F]);             for (i=F+1;i<F+L;i++) {                 sum+=d[i];                 printf("+%d",d[i]);             }             printf("=%d\n",sum);         }     }      return 0; } //----2---- //1+2=3 //2+3=5 //3+4=7 //4+5=9 //5+6=11 //----3---- //1+2+3=6 //2+3+4=9 //3+4+5=12 //4+5+6=15 //----4---- //1+2+3+4=10 //2+3+4+5=14 //3+4+5+6=18 //----5---- //1+2+3+4+5=15 //2+3+4+5+6=20 //----6---- //1+2+3+4+5+6=21 //

user: user-4
content: int* addfun(int *arr, int step, int *ret); int main() {                int i=0;     int arr[6] = {0, 1, 2, 3, 4, 5};      int ret[6] = {0, 0, 0, 0, 0, 0};      addfun(arr, 2, ret);     printf("result: \n");     while(ret[i] > 0)         printf("%d ", ret[i++]); }                         int* addfun(int *arr, int step, int *ret) {                int j = 0, num = 0;     for(int i=0; i<6; i++)     {                j = i + step;         if(j < 6)         {                printf("%d - %d: ", i, j);                                                                  for(int k=i; k<=j; k++)                 ret[num] += arr[k];             printf("%d\n", ret[num++]);         }        }            return ret; }

user: user-0
content: 引用 1 楼 user-5 的回复:外层循环 i 从1到6 内存循环从1到n，要两个数n就是2，三个数就是3 内层循环累加每次累加 我要的是每个相邻累加的结果，比如上面的3，5，7。。。，而不是3+5+7... 你这个循环的思路也不太明白，请问这个外层循环的意义是什么？

user: user-0
content: 我要的是每个相邻累加的结果，比如上面的3，5，7。。。，而不是3+5+7... 你这个循环的思路也不太明白，请问这个外层循环的意义是什么？

user: user-5
content: 外层循环 i 从1到6 内存循环从1到n，要两个数n就是2，三个数就是3 内层循环累加每次累加
user-0 提问: 格式控制符f和lf的差异

回复:
user: user-1
content: 因为 %f,%lf 本质上输出时候，都是输出的 double  制定标准的某些人，就认为，  %f,%lf 只需要一个，另一个是多余的 但是，他们觉得，%lf 更加多余，于是就废了%lf ， 似乎后来又给补上了，不过是作为可选处理  也就是说，float,double 浮点数输出,标准里面是 %f ,但是 double 也可以用 %lf了（某个版本又补了回来）

user: user-2
content: 我一直“好读书，不求甚解”~

user: user-3
content: printf Type Field Characters f double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.   scanf Type Field Characters e, E, f, g, G Floating-point value consisting of optional sign (+ or –), series of one or more decimal digits containing decimal point, and optional exponent (“e” or “E”) followed by an optionally signed integer value. Pointer to float.

user: user-4
content: 是的，表示的确实不一致

user: user-5
content: printf 和 scanf 中的格式控制符的含义并不完全相同。  printf 请看： http://en.cppreference.com/w/c/io/fprintf scanf 请看：http://en.cppreference.com/w/c/io/fscanf

user: user-0
content: 感谢大家的回答，看了一些资料后发现书上也有说printf和scanf函数的这点差异，谢谢大家的解答

user: user-6
content: 因为输出是转成字符串,占个空间由使用者控制, 而且没标注的浮点常量默认是double类型, 所以没必要分float和double. 而输入是由字符串转成float或double类型, float才4字节, 比较节约内存, 运算起来也比较快, 有这个需求, 所以分开.
user-0 提问: http协议，是不是可以不出现网页？

回复:
user: user-1
content: 随便找一本cpp的教材 都有个案例是写个聊天程序的服务端与客户端 而服务端就是监听某个端口 收到请求后返回 你说的是这个？

user: user-1
content: 你说http接口？ http://ip.taobao.com/service/getIpInfo.php?ip=123.32.11.22 这样？就是返回一个JSON字符串  另外感觉楼主概念的确有点混乱

user: user-0
content: 引用 9 楼 pb8 的回复:[quote=引用 8 楼 u012879787 的回复:] 还有 如果是主流开源http服务器，我想用它实现上面提到的功能，可行否？或者说它有没有类似的虚函数接口来解析客户端命令？  最后:主流服务器如何区分头和body? 如果是根据换行，那么是否靠不断recv,直到接受到换行才知道body开始了?这效率很低。 没这么复杂的，你不是基于TCP层去理解内容，对于WEB服务端，请求的数据会自动分隔到内置对象，如Request对象，请求的信息都可以从这里得到[/quote]  这样的。 web服务器段？  你看这个字眼是什么？ web服务器，  你再看我前面问什么？ 我说，这个http协议都没有web这个概念，  那么在这种情况下，你的web服务器还能够去 从你的request对象里提取出   我的命令吗？   因为我没用过 http服务器。  所以问题有点多

user: user-2
content: 引用 8 楼 u012879787 的回复:还有 如果是主流开源http服务器，我想用它实现上面提到的功能，可行否？或者说它有没有类似的虚函数接口来解析客户端命令？  最后:主流服务器如何区分头和body? 如果是根据换行，那么是否靠不断recv,直到接受到换行才知道body开始了?这效率很低。 没这么复杂的，你不是基于TCP层去理解内容，对于WEB服务端，请求的数据会自动分隔到内置对象，如Request对象，请求的信息都可以从这里得到

user: user-0
content: 引用 2 楼 pb8 的回复:soap与RESTFull方式写的Web服务通常都是基于HTTP协议这上的，HTTP协议与浏览器没有必然的联系，HTTP是TCP/IP协议簇里面的应用层协议，而浏览器是一种应用软件，浏览器只是用HTTP来与服务端来交互数据，像目前的微信支付、支付宝支付、微信工作号，还有很多WEBSERVICE/WEBAPI的接口，都是基于HTTP协议的，这个和浏览器都没半点必然的联系   我说的是：我见过一种实现方式,  没有任何web页，  http请求头里，一般常见的是：  get/post  请求url  http1.0/1.1  我见过的那个，由于没有web页，所以就没有 只好这么做：  get "命令" http1.1  命令： 验证用户名、修改用户名，等一系列自定义的命令。  另外：  报文头里有 “ Connection: Keep-Alive  ”    keep-alive是减少socket的连接次数，   由于http客户端、服务端都是自己实现， 我想问：    １.　这种算不算http协议？  ２.　这里的keep-alive 有效不？   个人感觉，这种http协议，完全就是一个私有的协议， 和普通的私有协议没有区别，只是挂着http的羊头

user: user-2
content: soap与RESTFull方式写的Web服务通常都是基于HTTP协议这上的，HTTP协议与浏览器没有必然的联系，HTTP是TCP/IP协议簇里面的应用层协议，而浏览器是一种应用软件，浏览器只是用HTTP来与服务端来交互数据，像目前的微信支付、支付宝支付、微信工作号，还有很多WEBSERVICE/WEBAPI的接口，都是基于HTTP协议的，这个和浏览器都没半点必然的联系

user: user-0
content: 还有 如果是主流开源http服务器，我想用它实现上面提到的功能，可行否？或者说它有没有类似的虚函数接口来解析客户端命令？  最后:主流服务器如何区分头和body? 如果是根据换行，那么是否靠不断recv,直到接受到换行才知道body开始了?这效率很低。

user: user-0
content: 引用 6 楼 pb8的回复:另外，下面你的理解也是错误的 http请求头里，一般常见的是：  get/post  请求url  http1.0/1.1  我见过的那个，由于没有web页，所以就没有 只好这么做：  get "命令" http1.1   HTTP协议里面不是说是WEB页，而是URI，术语是请求的资源， 请求的资源可以是一个服务，一个网页，也可以是一个图片，或一个文本文件 如果你请求的是首页，就是/，如果是一个服务，服务本身就会有一个URI，就是它的地址 我已经说了 get后是跟一个命令字符串 服务器根据这个串来判断是什么命令，然后调用虚函数解析消息体，

user: user-3
content: 你的概念混乱。一会客户端显示，一会服务端处理的，你连什么是http协议都不知道，更不用说自己在问什么了。 我用C语言自己写了一个http服务器，不知道算不算。

user: user-2
content: 另外，下面你的理解也是错误的 http请求头里，一般常见的是：  get/post  请求url  http1.0/1.1  我见过的那个，由于没有web页，所以就没有 只好这么做：  get "命令" http1.1   HTTP协议里面不是说是WEB页，而是URI，术语是请求的资源， 请求的资源可以是一个服务，一个网页，也可以是一个图片，或一个文本文件 如果你请求的是首页，就是/，如果是一个服务，服务本身就会有一个URI，就是它的地址

user: user-2
content: 另外，只要符合HTTP协议规范的就可以称为HTTP通讯，对请求头、请求体、响应头、响应体按HTTP协议规定的格式进行通讯的，都是HTTP通讯

user: user-2
content: http与web页没有必然的联系，http是传输层的协议，就好比是货车，web页是内容 报文里面的Connection: Keep-Alive，是指的客户端要求服务端保留请求的连接，这个是在http1.1协议以后才支持，至于服务器是否断开，是由服务端去控制的，前端只是表示它的能力（我可以进行长连接通讯）与意愿（我想让你保持这个连接），keep-alive方式常用于实时推送的实现
user-0 提问: VS2008如何读取Excel表格某一特定工作表（sheet）的内容？

回复:
user: user-0
content: //得到当前活跃sheet       //如果有单元格正处于编辑状态中，此操作不能返回，会一直等待       //Excel.Worksheet sheet=(Worksheet)(book.Worksheets.get_Item(0)); 	//lpDisp=book.get_ActiveSheet();  	//lpDisp=books.get_Item(COleVariant((long)1)); 	//打开需要读取的工作表，数字2表示sheet2 	lpDisp=sheets.get_Item(COleVariant((long)2));     sheet.AttachDispatch(lpDisp);       //读取第一个单元格的值       range.AttachDispatch(sheet.get_Cells());       range.AttachDispatch(range.get_Item (COleVariant((long)8),COleVariant((long)2)).pdispVal );    已经解决了，把关联sheet那一块的操作，换成上面的那句就能够实现了，注释上已经描述了，谢谢大家！

user: user-1
content: 在Excel 2003中开始记录宏，手动完成所需功能，结束记录宏，按Alt+F11键，查看刚才记录的宏对应的VBA代码。
user-0 提问: 如何用C语言把输入的密码隐形成*号？在线急求

回复:
user: user-1
content: #if defined(unix) #include<curses.h> #elif defined(_WIN32) #include<conio.h> #include<stdio.h> #else #error "Unknown OS" #endif int main() {     char str[256]={0},*p=str,c; #if defined(unix)     initscr();     cbreak();     noecho();     while((c=getch())!='\n')     {         *p++=c;         addch('*');     }     printw("\n%s\n",str);     getch();     endwin(); #elif defined(_WIN32)     while((c=getch())!='\n'&&c!='\r')     {         *p++=c;         putchar('*');     }     printf("\n%s\n",str); #endif     return 0; }

user: user-2
content: 引用 4 楼 ipqtjmqj 的回复: #include <conio.h> // getch, putch #include <stdio.h> // FILE, fopen, fclose, fscanf, printf #include <string.h> // strcmp void getpassword(char *p, int n) { 	int ch; 	int i; 	for (i = 0; (ch = getch())!= '\r' && i != n; *p++ = ch, putch(ch), ++i); 	*p = '\0'; } int Judge_Password() { 	char inp[20]; 	char p[20];     	FILE *fp = fopen("C:\\password.txt", "r"); 	fscanf(fp, "%s", p); 	fclose(fp);  	printf("Please input init password (no more than 15ch)\n"); 	getpassword(inp, 19); 	return strcmp(inp, p) == 0; } int main() { 	printf("%d", Judge_Password()); 	return 0; }  打错了 ,getpassword函数中putch(ch)改成putch('*');

user: user-2
content: #include <conio.h> // getch, putch #include <stdio.h> // FILE, fopen, fclose, fscanf, printf #include <string.h> // strcmp void getpassword(char *p, int n) { 	int ch; 	int i; 	for (i = 0; (ch = getch())!= '\r' && i != n; *p++ = ch, putch(ch), ++i); 	*p = '\0'; } int Judge_Password() { 	char inp[20]; 	char p[20];     	FILE *fp = fopen("C:\\password.txt", "r"); 	fscanf(fp, "%s", p); 	fclose(fp);  	printf("Please input init password (no more than 15ch)\n"); 	getpassword(inp, 19); 	return strcmp(inp, p) == 0; } int main() { 	printf("%d", Judge_Password()); 	return 0; }

user: user-3
content: 输入直接显示*，然后在内部用结构体保存密码。

user: user-4
content: 仅供参考：#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() {     cprintf("\r\nPassword:");     i=0;pw[i]=0;     while (1) {         ch=getch();         if (ch==13 || i>=39) break;         switch (ch) {         case 27:             cprintf("\rPassword: %40s"," ");             cprintf("\rPassword: ");             i=0;pw[i]=0;             break;         case 8:             if (i>0) {                 i--;                 pw[i]=0;                 cprintf("\b \b");             }             break;         default:             pw[i]=ch;             i++;             pw[i]=0;             cprintf("*");             break;         }     }     cprintf("\r\n");     f=fopen("password.txt","w");     fprintf(f,"%s\n",pw);     fclose(f); }

user: user-5
content: #include <stdio.h> #include <conio.h> int main () {     int ch;      while ((ch = getch ()) != '\r') {         putchar ('*');     }      return 0; }
user-0 提问: 执行这个时，temp等于10时为什么输出时是0啊？

回复:
user: user-1
content: “新来的没有权限修改自己的帖子，只好再写一个了。”  所以呢，如果想实现你的目的，可以定义一个字符串数组。 不考虑编码规范的前提下，修改如下： { int i; char* temp[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; for(i=0;i<=12;i++) printf("CLUBS  %s DIAMONDS  %s HEARTS  %s SPADES  %s\n",temp[i],temp[i],temp[i],temp[i]);     return 0;   }  不过这段程序仍然没太看明白：使用了循环，每次又输出多张牌的内容。。

user: user-1
content: 1. 10作为一个字符太长了。你看看ascii表就知道了，没有‘10’这么个字符。http://www.asciitable.com/ 2. 让我意外的是，编译器是允许这么写的。只不过他将多余的高位给扔掉了。所以，‘10’就剩下‘0’了。 同理，如果你写‘15’那就剩下‘5’了。 你编译的时候，编译器给warning了，你可能没注意。参见下图。（抱歉日语的，不过warning号码应该一样）   happy2study.tk

user: user-2
content: 引用An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character set, is conditionally-supported, has type int, and has an implementation-defined value. 如果你不知道编译器的行为，就不要使用它
user-0 提问: 请教各位大神~关于strtok的参数问题

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 因为那个函数会对你的输入字符串进行修改，在分隔符的地方替换字符为\0,如果你给常量字符串，这样的操作是被禁止的，当然要报错了。另外这个函数是多线程不安全的，切勿在多线程应用中使用。
user-0 提问: 输出e的值并统计累加项数，，感觉运行结果错误，各位大神，帮忙看下，，

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  int main() {     int		i, t = 1;     double 	m, e = 1.0;     for(i = 1; ; i++)     {         t = t * i;         m = 1.0 / t;         e = e + m;         if(fabs(m) <= 1e-8)             break;     }     printf("i = %d, e = %.8f\n", i, e);      return 0; }

user: user-0
content: 怎么没人啊  asdasdasdas
user-0 提问: 为什么加了zlib库 还是提示compress（）未定义

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:-lxxxx 指示链接xxxxlib.a 这个就是-lz /usr/include/zlib.h才能成功

user: user-1
content: -lxxxx 指示链接xxxxlib.a

user: user-2
content: 引用 2 楼 qiake110 的回复:[quote=引用 1 楼 user-2 的回复:] 链接时加 -lz 。  你没有链接 zlib 的库。 还真是，太感谢了！ 不过求教一下 为什么zlib.h已经在/usr/include/目录下了 还要链接zlib库呢 gcc 默认的链接库 不就是/usr/include/目录吗 [/quote]  C 从源代码到程序要经历两个大的步骤，一个是编译(compile)，一个是链接(link)。  .h 在编译的时候使用，告诉编译器 compress 是一个函数。（这个由 #include 指定） 库文件在链接的时候使用，提供了 compress 函数的（已经编译好的）具体实现。（这个需要由命令行指定）  库文件不是 .h ，一般为 .a (Linux, 静态库）或 .so （Linux，动态库）

user: user-0
content: 引用 1 楼 user-2 的回复:链接时加 -lz 。  你没有链接 zlib 的库。 还真是，太感谢了！ 不过求教一下 为什么zlib.h已经在/usr/include/目录下了 还要链接zlib库呢 gcc 默认的链接库 不就是/usr/include/目录吗

user: user-2
content: 链接时加 -lz 。  你没有链接 zlib 的库。
user-0 提问: 简单的四则运算问题，头晕了。。。请教各位。

回复:
user: user-1
content: 弄的这么麻烦能保证ID不同吗

user: user-2
content: 看到楼上回复被爆击了，发现我看题都看歪了。

user: user-3
content: 引用 楼主 yukuang 的回复:图中为一个长方体，x,y,z为三维方向按箭头所示，值分别为x=4,y=6,z=4。　圆圈中的数字表示节点的ID号。　请教6个表面的ID，用x,y,z怎么表示？ 如： 上表面表示为：ID<=y*z 下表面表示为：ID>(x-1)*y*z 其它的4个表面，即左右前后该怎么表达啊？  如图：

user: user-2
content: 写错了 ID/100 区分上下， (ID%100)/10前后，   ID%10区分左右

user: user-2
content: Z/100 区分上下， Y/10前后，   X%10区分左右

user: user-2
content: ID=X+Y*10+Z*100  上下左右用X/10，X%10之类表示

user: user-4
content: 是否这样： 左：y=0 右：y=5 前：z=0 后：z=3 貌似高数翻一翻里面有，都忘了。
user-0 提问: 数据类型的小问题

回复:
user: user-1
content: printf在遇到float或double时压栈均以double入栈, 第一个%x是以int取数, 而下一个%f才以double 取数,  从内存上看就很好理解了 10.0 的doubel 在二进制是 00 00 00 00 00 00 24 40, 那个两次压栈后在内存里是 00 00 00 00 00 00 24 40 00 00 00 00 00 00 24 40, 第一个%x刚好取到4个0, 而第二个%f得到的是00 00 24 40 00 00 00 00这个数看不出来没关系, 放在C里面显示一下就可以了, 其实它指数位0, 就是2^-1023了, 应该很小了

user: user-2
content: 那就要看printf是怎么处理的了

user: user-3
content: %x只能输出整型, 输出浮点型的行为未定义
user-0 提问: 请推荐一些高性能的矢量直线绘制到位图的算法

回复:
user: user-1
content: 5000*3000 *8 /8 =15M 这个位图很小了 24Bits也才 45M 不算太大

user: user-2
content: GDI

user: user-3
content: lz又不说明干嘛的, 用来显示的话, 又要效率又要矢量. Direct2D吧. 我的垃圾显卡都支持1W+宽度的位图.

user: user-4
content: 如果不用GPU的话，基本都慢

user: user-5
content: 应该每天直线 都单独一个线程 然后2分搜索法  什么的

user: user-5
content: 你这个是想做什么啊？感觉跟我在弄的一个东西很像
user-0 提问: 纯C语言课程设计--类似于打飞机的游戏  求思路！

回复:
user: user-1
content: http://www.zixue7.com/thread-826-1-1.html

user: user-2
content: 引用 3 楼 heqiao1996 的回复:[quote=引用 1 楼 u010165006 的回复:] 在while(1)循环中，也处理敌机，每一架敌机，可以用rand()产生随机位置。 推荐你一本书，《Windows游戏程序设计基础》秦海玉，里面有个打飞机游戏的完整案例，不过是C++的，比C语言复杂了一点，有10几个类，能把它调试通过也是不错的。  谢谢！ 请问里面的原理可以用纯C写出来么？[/quote] 改成C语言版估计难度较大，有复杂的生成、管理、调用的关系（飞机、敌机、导弹、子弹等），改成C函数调用不容易。

user: user-3
content: http://blog.csdn.net/user-3/article/category/2922463 可以参考下我写的雷电大战的过程（虽说没完成），其中可以参数下移动路径设置。智能AI设计。参考下我的思路

user: user-0
content: 引用 1 楼 u010165006 的回复:在while(1)循环中，也处理敌机，每一架敌机，可以用rand()产生随机位置。 推荐你一本书，《Windows游戏程序设计基础》秦海玉，里面有个打飞机游戏的完整案例，不过是C++的，比C语言复杂了一点，有10几个类，能把它调试通过也是不错的。  谢谢！ 请问里面的原理可以用纯C写出来么？

user: user-0
content: 谢谢！ 请问里面的原理可以用纯C写出来么？

user: user-2
content: 在while(1)循环中，也处理敌机，每一架敌机，可以用rand()产生随机位置。 推荐你一本书，《Windows游戏程序设计基础》秦海玉，里面有个打飞机游戏的完整案例，不过是C++的，比C语言复杂了一点，有10几个类，能把它调试通过也是不错的。
user-0 提问: 字符问题

回复:
user: user-1
content: 引用 4 楼 SHRDLU 的回复:引用 1 楼 ipqtjmqj 的回复:整形字符常量，默认类型是int，就像浮点型默认是double那个char a='c';而a占1个字节'c'占4个字节，转换的话不会丢失数据吗； 当然可能会丢失，但视情况。 float f = 1.1 int i = f; 这样会丢失，但如果f是1就不会丢失

user: user-1
content: #include<stdio.h> int main() { 	printf("%d, %d, %d, %d\n", sizeof('a'), sizeof('ab'), sizeof('abc'), sizeof('abcd'));  // 结果都是4 	printf("%d", sizeof('abcde')); // 这句VC会报错，MinGW是个警告，因为int型的只能放4个字节 	return 0; }

user: user-0
content: 引用 1 楼 ipqtjmqj 的回复:整形字符常量，默认类型是int，就像浮点型默认是double那个char a='c';而a占1个字节'c'占4个字节，转换的话不会丢失数据吗；

user: user-2
content: 字符型常量一律按整型常量处理，见C标准 §6.4.4.4 10 An integer character constant has type int. The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer. The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined. If an integer character constant contains a single character or escape sequence, its value is the one that results when an object with type char whose value is that of the single character or escape sequence is converted to type int.

user: user-0
content: 引用 1 楼 ipqtjmqj 的回复:整形字符常量，默认类型是int，就像浮点型默认是double那样的话char a='c';怎么转换的，请从内存那块谈起

user: user-3
content: 应该是编译器看到'c'就自动用数字填充了（数字的类型默认是int，占4个字节），不知道对不对。  int main () {     char ch = 'c';     printf ("%u -> %c\n", sizeof (ch), ch);     printf ("%u -> %c\n", sizeof ('c'), 'c');     printf ("%u -> %c\n", sizeof (0x63), 0x63);     return 0; }

user: user-1
content: 整形字符常量，默认类型是int，就像浮点型默认是double
user-0 提问: c库函数头文件中函数定义的标识符如何理解

回复:
user: user-0
content: 引用 1 楼 赵4老师的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 谢谢了，下次上机试试

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 几行代码就出了个大问题，解决不了啊。各位帮忙看一下

回复:
user: user-1
content: 引用 5 楼 u010165006 的回复:小程序，这些定义貌似没必要，重要的是理解程序的流程、控制流程的方法、简单的算法（比如计算一个n的阶层n!）等，不能过于形式。另外，一般OK的返回0，Error的返回正整数，shell可以根据调用得到的返回值比如1或2或3等来判断是哪种错误，DOS就是这样的。 shell可以根据调用（运行程序）得到的返回值比如1或2或3等来判断是哪种错误，DOS就是这样的。

user: user-1
content: 小程序，这些定义貌似没必要，重要的是理解程序的流程、控制流程的方法、简单的算法（比如计算一个n的阶层n!）等，不能过于形式。另外，一般OK的返回0，Error的返回正整数，shell可以根据调用得到的返回值比如1或2或3等来判断是哪种错误，DOS就是这样的。

user: user-2
content: 2楼正解，建议main入口也写成main(void)

user: user-3
content: 楼上说的都对

user: user-4
content: Status main() 你如果是想定义一个返回值为Status型的函数，就不要使用main命名你的函数，和默认的main冲突； 如果你只是想进入主函数，楼上正解； 不知道void main（）行不行。

user: user-5
content: Status main() => int main(void);
user-0 提问: C的有向图的十字链表入度输出问题

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

回复:
user: user-1
content: switch((int)s/500) 当然是可以的，但是或许你想要的是 switch((int)(s/500))  你不告诉别人你想要什么结果，只说个结果不对谁能猜到你想要什么

user: user-2
content: double型的是lf

user: user-0
content: 想要输入的值，能取到1、2、3之类的整数

user: user-0
content: Switch  得到与case对应的整数

user: user-3
content: （(int)(s/500)）

user: user-4
content: scanf("%lf",&s);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: [菜鸟求助]这个程序错了吗?怎么运行的

回复:
user: user-1
content: 引用 5 楼 only_one_moment 的回复:引用 4 楼 fefe82 的回复:sqrt 是有误差的，sqrt(100) 不一定就能得到 10我在前面加上了（int）转换还是不行  如果 sqrt(100) 不是 10 的话，你转成 int 也可能得不到 10 啊

user: user-0
content: 引用 4 楼 fefe82 的回复:sqrt 是有误差的，sqrt(100) 不一定就能得到 10我在前面加上了（int）转换还是不行

user: user-1
content: sqrt 是有误差的，sqrt(100) 不一定就能得到 10

user: user-0
content: int IsTheNumber ( const int N ){ 	int n=N;  	int p=sqrt(N); 	if(p*p==N){ 	 		int temp, flag[10] = {0}; 		     for(temp=n%10;n;n/=10,temp=n%10)         if((flag[temp]++)== 2) return 1; 		return 0; 	} 	else return 0; 	 } 我自己又改了一下子函数我真的看不错错误，为什么还是错了

user: user-0
content: PAT上显示程序答案错误，但是自己运行没出错，最后的子函数可以讲解一下吗，看不懂怎么检验的

user: user-0

user: user-2
content: 引用 13 楼 only_one_moment 的回复:[quote=引用 9 楼 github_27756899 的回复:] if((flag[temp]++)== 2) return 1; 改为: if((++flag[temp])== 2) return 1;如果没把++提前的话，是不是先执行比较操作？[/quote] 没把++提前的话，先执行比较操作.

user: user-0
content: 引用 9 楼 github_27756899 的回复:if((flag[temp]++)== 2) return 1; 改为: if((++flag[temp])== 2) return 1;如果没把++提前的话，是不是先执行比较操作？

user: user-0
content: 引用 10 楼 github_27756899 的回复:[quote=引用 3 楼 only_one_moment 的回复:] int IsTheNumber ( const int N ){ 	int n=N;  	int p=sqrt(N); 	if(p*p==N){ 	 		int temp, flag[10] = {0}; 		     for(temp=n%10;n;n/=10,temp=n%10)         if((flag[temp]++)== 2) return 1; 		return 0; 	} 	else return 0; 	 } 我自己又改了一下子函数我真的看不错错误，为什么还是错了 改为楼上的代码，试试.[/quote]谢谢你们，我把N改成了n+1然后把++提前程序就对了，

user: user-0
content: 引用 6 楼 fefe82 的回复:引用 5 楼 only_one_moment 的回复:[quote=引用 4 楼 fefe82 的回复:] sqrt 是有误差的，sqrt(100) 不一定就能得到 10我在前面加上了（int）转换还是不行  如果 sqrt(100) 不是 10 的话，你转成 int 也可能得不到 10 啊[/quote]谢谢你们，我把N改成了n+1然后把++提前程序就对了，

user: user-2
content: 引用 3 楼 only_one_moment 的回复:int IsTheNumber ( const int N ){ 	int n=N;  	int p=sqrt(N); 	if(p*p==N){ 	 		int temp, flag[10] = {0}; 		     for(temp=n%10;n;n/=10,temp=n%10)         if((flag[temp]++)== 2) return 1; 		return 0; 	} 	else return 0; 	 } 我自己又改了一下子函数我真的看不错错误，为什么还是错了 改为楼上的代码，试试.

user: user-2
content: if((flag[temp]++)== 2) return 1; 改为: if((++flag[temp])== 2) return 1;

user: user-3
content: //Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); }

user: user-4
content: 可以写成 sqrt(n + 1) 判重复时，若flag[]内容都初始化成0，则 if (flag[temp]++ == 1) 没问题
user-0 提问: 关于C语言函数参数为另一个函数地址的问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 你利用本来应该返回到main的跳转，改了地址，跳到了userret函数，但是跳之前却没有保存之前的位置，所以出错了。 下面代码是最简单的实现这一功能，弄成汇编，看看就明白了  #include<stdio.h> void b() { 	puts("b"); } void a(int n) { 	*(&n - 1) = (int)b; } int main() { 	a(1); 	return 0; }
user-0 提问: 求解数字问题

回复:
user: user-1
content: a小于0后，置0，继续向下执行到减2操作，得-2，判断a是否为0，不为0，继续循环执行。

user: user-2
content: 自己写一下在每一轮循环，每一条语句执行之后 a 的值。
user-0 提问:  结构体初始化和输出问题

回复:
user: user-1
content: char name[10]; 改为：char name[11]; 原因各楼已给出。

user: user-1
content: 引用 楼主 hanxia12356789 的回复:定义一个学生结构体，包含姓名，学号，成绩，存放姓名，学号的都是一个长度为10的字符数组，在运行的过程中发现在初始化学号的时候，如果学号长度正好为10的时候，输出的时候就会比输入的学号多一个字符，这个字符对应的assic码就是输入的成绩大小，代码如下： #include<iostream> #include<vector> using namespace std; struct student { 	char name[10]; 	char num[10]; 	int score; }; int main() { 	int n; 	cin>>n; 	vector<struct student> vec; 	for(int i=0;i<n;i++) 	{ 		struct student stu; 		cin>>stu.name>>stu.num>>stu.score; 		vec.push_back(stu); 	} 	cout<<vec[0].name<<' '<<vec[0].num<<endl<<vec[0].score;  }   测试结果如下 ：当输入的学号长度等于字符数组的长度10的时候，如果成绩为89，则在输出学好的时候，会在后面多一个Y，不知道为什么，请各位经过的大神，多多指教，小女子在此谢过了  如果学号长度小于10的时候，则输出正常，如下图  cout<<vec[0].name<<' '<<vec[0].num<<endl<<vec[0].score; 改为:cout<<vec[0].name<<' '<<vec[0].num<<' '<<vec[0].score;试试。//endl

user: user-2
content: 字符数组必须要多申请一个放结束符~

user: user-3
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-4
content: 多占的空间（行话叫“越界”）如果是一般的自动变量的位置，可能不会出现问题；如果是函数返回地址之类的关键位置，运行时系统就能发现了

user: user-0
content: 引用 1 楼 shangyu0801 的回复:妹子你好。  字符串是以'\0'结尾的。如果你要输入十个字符的字符串，其实是占用了11个字符的空间，因为结尾有'\0'。所以如果你的学号需要10个字节，定义数组的时候，最小应该是11个字节的空间。  你好，可是为什么数组长度为10的时候，我输入10个字符也没有报错呢#include<iostream> #include<vector> using namespace std; int main() { 	char num[10]; 	cin>>num; 	cout<<num; } 这个代码，我输入10个字符的时候就会提示

user: user-5
content: 妹子你好。  字符串是以'\0'结尾的。如果你要输入十个字符的字符串，其实是占用了11个字符的空间，因为结尾有'\0'。所以如果你的学号需要10个字节，定义数组的时候，最小应该是11个字节的空间。
user-0 提问: 请教各位大神~关于逗号表达式还有参数求值顺序？

回复:
user: user-1
content: 未定义行为 结果不可以预测 请看置顶： [置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]

user: user-2
content: 引用 2 楼 u013112097 的回复:可是为什么两个 printf 输出 x 都是 3 呢？我觉得应该有一个是 0 ？为什么两个 printf 都先算了逗号表达式那个参数呢？ 编译器爱怎么做就怎么做 C语言没有规定该按什么顺序 所以，在参数表中修改变量的值，是所谓的“未定义”行为，任何结果都有可能出现，真正的程序员严禁编写这种代码

user: user-0
content: 可是为什么两个 printf 输出 x 都是 3 呢？我觉得应该有一个是 0 ？为什么两个 printf 都先算了逗号表达式那个参数呢？

user: user-2
content: 逗号表达式中，从左往右求值 函数的实际参数，求值顺序没有规定
user-0 提问: 请教各位大神，关于下标引用，-1[ap] 输出很奇怪

回复:
user: user-1
content: 2[a]就是a[2]在for循环里赋的值，所以是2  -1[ap]由于下标运算符的优先级大于负号，所以它与ap[-1]不一样 应该是-ap[1]，由于ap = a + 2所以-ap[1] = -a[3] = -3  6[a]就量a[6]越界了，不过地址正好是i的，i加到5，循环结束，所以a[6] = 5

user: user-2
content: 当 p i 是一个指针和一个整型时： p[i] i[p] *(p+i) *(i+p) 是等价的。

user: user-0
content: 改成C语言后面三个也是一样的 我的编译选项：  mingw32-g++.exe -Wall -fexceptions -g  -c  mingw32-gcc.exe -Wall -g  -c
user-0 提问: b=(++a)+(++a)+(++a)运行结果疑问？

回复:
user: user-1
content: http://bbs.csdn.net/topics/370153775

user: user-2
content: 同意二楼的说法。 个人建议，写这种表达式的人只是想说明表达式中是存在求值顺序的，让我们在程序开发过程中注意由此而带来的副作用，不是让我们研究这个表达式到底是什么结果，我的结论是没有固定的结果，我用不同的编译器试过，结果不一样。

user: user-3
content: 这种题目是不是每隔一年就要冒出来一阵。  又有一波新人来了。

user: user-4
content: 看置顶贴子，以后楼主要是在这个论坛问这样的问题，估计要被喷死。

user: user-5
content: 顺序点问题  参看置顶贴：http://bbs.csdn.net/topics/370153775

user: user-6
content: 引用 1 楼 user-8 的回复:个人是这么理解的 四则运算，两两结合 (++a)+(++a)+(++a) 实际上编译时(++a)+（(++a)+(++a)） 后面的(++a)+(++a)会将结果算出来存入内存中， 实际上等价于 c=(++a)+(++a) b=(++a)+c C语言标准中明确说了这属于未定义的行为 得到任何结果都有可能 不要妄自猜测了 不要被一些书本中的所谓分析给误导了 在公司里如果有人敢这样写代码，哼哼

user: user-7
content: 未定义行为 结果不可预测 [置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]

user: user-8
content: 个人是这么理解的 四则运算，两两结合 (++a)+(++a)+(++a) 实际上编译时(++a)+（(++a)+(++a)） 后面的(++a)+(++a)会将结果算出来存入内存中， 实际上等价于 c=(++a)+(++a) b=(++a)+c
user-0 提问: 请大神看一下哪里出问题了

回复:
user: user-0
content: 已找到答案，就是把数组定义的长度增大，因为哨兵会占用值。

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

user: user-0
content: 引用 2 楼 china7628的回复:这个程序有点问题： 1、你在insert函数中用到了[n]，但你的main函数中定义r[11]，你用了r[11]，这个是不存在的。 2、你写这个程序的目的是什么？如果是测试某种用法的话，就不要定义那么复杂的结构了。 3、你定义了一个结构数组，你在insert函数中用了，这个数组本身的初始化值是不固定的。 4、你的insert函数没有对r[1]进行操作，输出结果中会不会是r[1]是空的。 5、我用Dev c++编译出错，cr a[]={,32,第一个数据为空，我加了一个0，但没有任何输出，输出是空的 我能运行，并且进行排序，但是会少一个数字。V C运行

user: user-0
content: 引用 1 楼 user-3的回复:1. 你的程序期望完成什么功能？ 2. 你的程序是否有输入？如果有，输入是啥？ 3. 你的程序的输出是啥？你期望的输出是啥？ 不用输入，就是对数组里的数排序

user: user-2
content: 这个程序有点问题： 1、你在insert函数中用到了[n]，但你的main函数中定义r[11]，你用了r[11]，这个是不存在的。 2、你写这个程序的目的是什么？如果是测试某种用法的话，就不要定义那么复杂的结构了。 3、你定义了一个结构数组，你在insert函数中用了，这个数组本身的初始化值是不固定的。 4、你的insert函数没有对r[1]进行操作，输出结果中会不会是r[1]是空的。 5、我用Dev c++编译出错，cr a[]={,32,第一个数据为空，我加了一个0，但没有任何输出，输出是空的

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

user: user-3
content: 1. 你的程序期望完成什么功能？ 2. 你的程序是否有输入？如果有，输入是啥？ 3. 你的程序的输出是啥？你期望的输出是啥？
user-0 提问: func(++i, i++)  分析求助  C语言

回复:
user: user-1
content: 引用 10 楼 qldsrx 的回复:在C语言中，函数的参数是从右到左的顺序压入到栈的，函数执行时再从栈弹出弹出来执行。 因此，先执行i++，压入的是0，然后i的值变为了1，然后执行++i，i的值变为了2，再压入这个i的值2，因此就得到了那个执行结果了。 下面说下C#语言，函数的参数是从左到右的顺序压入栈的，函数执行时，一次性弹出全部参数来执行。 因此，在C#里面执行的结果刚好相反，先执行++i后，压入1到栈里，再执行i++，压入的还是1，之后i变为了2。  所以这样的题目我个人认为意义不大，避免使用这种复用的++运算符就可以了。  C语言不是后压入栈的先出栈么，所以应该是先执行++i的吧！请指教

user: user-2
content: 在C语言中，函数的参数是从右到左的顺序压入到栈的，函数执行时再从栈弹出弹出来执行。 因此，先执行i++，压入的是0，然后i的值变为了1，然后执行++i，i的值变为了2，再压入这个i的值2，因此就得到了那个执行结果了。 下面说下C#语言，函数的参数是从左到右的顺序压入栈的，函数执行时，一次性弹出全部参数来执行。 因此，在C#里面执行的结果刚好相反，先执行++i后，压入1到栈里，再执行i++，压入的还是1，之后i变为了2。  所以这样的题目我个人认为意义不大，避免使用这种复用的++运算符就可以了。

user: user-0
content: 引用 2 楼 qldsrx 的回复:不建议在函数或表达式计算中使用这种复用的++运算符，不同的语言，不同的编译器，处理方式是不同的，你搞清这个了，换一个场景可能会不一样，这是自找麻烦，你直接定义两个变量，计算好了传递不是就好了吗？你好，我这题是在网上做C语言的测试题做到的，实际中我不会这样写的！

user: user-0
content: 引用 3 楼 wang0635 的回复:哪个老师出的题？这个是我在网上做c语言的题目做到的！

user: user-3
content: 引用 4 楼 liunian_MEI 的回复:func(++i,i++); C语言的顺序，自右向左 i=0 i++后为1，但是++在后，先赋值后+1 ++i，先加1，后赋值 因此 v1=2 v2=0  还有我想说一句，人家只是来问一个问题，这个问题可能对于你很简单，但是别人不是，我觉得给建议可以，但是至少是在帮别人解决完问题后你以为你在是在解决问题?? 请冷静的看看别人的回答 别误人子弟

user: user-4
content: 1.搞清楚 ++i和i++的返回值。 2.搞清楚所用编译执行函数时参数执行顺序。 3.散分吧

user: user-5
content: func(++i,i++); C语言的顺序，自右向左 i=0 i++后为1，但是++在后，先赋值后+1 ++i，先加1，后赋值 因此 v1=2 v2=0  还有我想说一句，人家只是来问一个问题，这个问题可能对于你很简单，但是别人不是，我觉得给建议可以，但是至少是在帮别人解决完问题后

user: user-6
content: 引用 3 楼 wang0635 的回复:哪个老师出的题？ 谭浩强的第八代徒孙。

user: user-7
content: 哪个老师出的题？

user: user-2
content: 不建议在函数或表达式计算中使用这种复用的++运算符，不同的语言，不同的编译器，处理方式是不同的，你搞清这个了，换一个场景可能会不一样，这是自找麻烦，你直接定义两个变量，计算好了传递不是就好了吗？

user: user-8
content: [置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]
user-0 提问: 大神求解~~~C语言*与++、--操作的优先级问题

回复:
user: user-0
content: 引用 5 楼 wang0635的回复:函数的实际参数，求值顺序没有规定 编译器爱怎么做就怎么做 C语言没有规定该按什么顺序 所以，在参数表中修改变量的值，是所谓的“未定义”行为，任何结果都有可能出现，所有的解释只是解释巧合现象，真正的程序员严禁编写这种代码 哦哦，明白了~马上扔书~

user: user-1
content: 函数的实际参数，求值顺序没有规定 编译器爱怎么做就怎么做 C语言没有规定该按什么顺序 所以，在参数表中修改变量的值，是所谓的“未定义”行为，任何结果都有可能出现，所有的解释只是解释巧合现象，真正的程序员严禁编写这种代码

user: user-0
content: 引用 3 楼 Static_Love 的回复:引用 2 楼 wang0635 的回复:你都看的什么书啊，还不扔掉求讲解啊~~我是这么理解的            1    2    3    4    5             ^             p int    *p=a; 所以p指向的是数组的首地址 printf函数中从右往左的输出的值依次是 *p：因为p指向数组首地址，所以*p的值是1; --(*p):因为*p=1，所以--(*p)=1-1=0,*p的值就变成了0， 数组就变成了：0    2    3    4    5; *p--:*p=0,然后p的指针减去1就指向了首地址前一个地址了         0     2     3     4     5   ^  p *p:所以*p指向的是一个随机数 (*p)++:因为是后++，所以(*p)++的值还是上一个的随机数 *(++p):因为++p，所以p的地址有重新指向了数组的首地址，所以*(++p)=0; *p:所以*p还是=0; 所以最后的输出结果是：0    0    随机数    随机数    0    0    1 Linux系统下的输出跟这个是一样的 但是windows系统下输出的是：2    2    0    0    0    0    1

user: user-0
content: 引用 2 楼 wang0635 的回复:你都看的什么书啊，还不扔掉求讲解啊~~

user: user-1
content: 你都看的什么书啊，还不扔掉

user: user-2
content: 未定义行为，参见置顶：  http://bbs.csdn.net/topics/370153775
user-0 提问: C语言定义一个整形变量  以字符型输入   再以整形输出  为啥会是这样的结果

回复:
user: user-1
content: 一个int应该有4个字节，你只修改了其中的一个字节，其它三个字节的内容未知，当你重新输出的时候，输出的四个字节的内容，如果你输出16进制，应该可以看到你输入的46(A的十六进制数据）。所以结果和你预想的不一样，解决的方法是int a=0; 清除原来四个字节的内容，应该就没有问题了，你可以试试。

user: user-2
content: 不赋初值，里面也是有值的。  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:#include<stdlib.h> #include<stdio.h> int main() { int a=0x12345678; printf("input the data\n"); scanf_s("%c", &a,1); printf("%08x\n",a); putchar(a%128); system ("pause"); return 0; }   请问为何实现赋初值之后  会正确 ？

user: user-2
content: #include<stdlib.h> #include<stdio.h> int main() { int a=0x12345678; printf("input the data\n"); scanf_s("%c", &a,1); printf("%08x\n",a); putchar(a%128); system ("pause"); return 0; }

user: user-3
content: 你的程序错了，出现什么结果都有可能。

user: user-4
content: 请检查scanf函数的返回值
user-0 提问: 分数序列求和

回复:
user: user-1
content: 引用 7 楼 qq_31521965 的回复:[quote=引用 3 楼 llq108 的回复:] 如果a和b都是整数，值分别是1和2，那相除出来的结果是0。但其实结果应该是0.5，所以要用浮点数来表示。    好像就是这样..意思就是其实也可以定义a b为整数型 只要将其改变形态就行啦吗？ 就像2/4是整数 而2/4.0 是浮点数这样吗？[/quote]  int a = 2,b = 4; float c = a / float(b); //你这样得到的c就是0.5了

user: user-0
content: 引用 3 楼 llq108 的回复:如果a和b都是整数，值分别是1和2，那相除出来的结果是0。但其实结果应该是0.5，所以要用浮点数来表示。    好像就是这样..意思就是其实也可以定义a b为整数型 只要将其改变形态就行啦吗？ 就像2/4是整数 而2/4.0 是浮点数这样吗？

user: user-2
content: 分数的结果一般有小数点，结果为浮点型，如果定义为整型，得不到结果。

user: user-1
content: 如果a和b都是整数，值分别是1和2，那相除出来的结果是0。但其实结果应该是0.5，所以要用浮点数来表示。

user: user-3
content: http://img.my.csdn.net/uploads/201301/04/1357276191_5263.jpg

user: user-4
content: 这里边也是有精度问题的~应该先通分。

user: user-5
content: 两个整形除出来还是整形啊

user: user-6
content: 可以啊，只是不那么方便，但是更加准确， 毕竟分数是整数相除的结果，不是实数相除的结果。