Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言不强调函数前向声明导致的错误

回复:
user: user-1
content: 引用 10 楼 grf123 的回复:#include<stdio.h> int add(float,float);    // 这样就叫显示声明了。 int main() { 	printf("%d\n",add(3.2,4.8));   // C是从上到下编译的，声明之后，编译器会在下面找。前面不声明，它就要默认为int 了。 	return  0; }  // 这里，叫定义，不叫声明。区分声明和定义。define and declare  int add(float a,float b) { 	printf("%f\n",a);//结果-0.000000 	printf("%f\n",b);//结果2.150000 	return 3; } 是定义就不叫声明？扯。

user: user-1
content: 引用 7 楼 user-9 的回复:楼主没有搞清楚状况吧！  谁说C语言不要求前导声明啊，那叫隐式声明。  C99就不说了，二十多年前的C89就说的清清楚楚：     If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration           extern int  identifier(); 什么叫不说了，obselete还无视了？

user: user-2
content: 是 printf("%f\n",add(3.0,4.0)); int printf( const char* format, ...);  后面 。。。 是 不知道 类型 的

user: user-3
content: 需要前置声明的

user: user-4
content: 这里说的很明显，编译器认为传给%f的是int，也就是默认声明的add的返回值类型 func.c:12:3: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]

user: user-4
content: 因为你没有事先声明，c编译器在main里面第一次见到add的时候会采取默认声明，把add作为一个返回int的函数。但是接下来定义的add是返回float，所以就冲突了 func.c:16:7: error: conflicting types for ‘add’  // 这里说的就是类型冲突，16行定义的float的add func.c:12:17: note: previous implicit declaration of ‘add’ was here  // 12行默认声明的int的add 虽然c不强制声明，还是都声明了比较稳妥，没必要跟自己跟编译器较劲

user: user-5
content: C语言强制要求函数使用前需声明

user: user-6
content: 使用函数前都要申明一下！C语言应该是会进行参数检查的，我的看法！

user: user-7
content: #include<stdio.h> int add(float,float);    // 这样就叫显示声明了。 int main() { 	printf("%d\n",add(3.2,4.8));   // C是从上到下编译的，声明之后，编译器会在下面找。前面不声明，它就要默认为int 了。 	return  0; }  // 这里，叫定义，不叫声明。区分声明和定义。define and declare  int add(float a,float b) { 	printf("%f\n",a);//结果-0.000000 	printf("%f\n",b);//结果2.150000 	return 3; }

user: user-0
content: 长知识了！ 返回值默认为int，那隐式声明对函数的参数列表是怎么假设的？如下例子 传入的参数为什么是错误的？难道也默认为int吗？求指导！！ #include<stdio.h> int main() { 	printf("%d\n",add(3.2,4.8)); 	return  0; } int add(float a,float b) { 	printf("%f\n",a);//结果-0.000000 	printf("%f\n",b);//结果2.150000 	return 3; }

user: user-8
content: http://translate.google.cn/?hl=zh-cn&tab=wT#en/zh-CN/If%20the%20expression%20that%20precedes%20the%20parenthesized%20argument%20list%20in%0D%0Aa%20function%20call%20consists%20solely%20of%20an%20identifier%2C%20and%20if%20no%0D%0Adeclaration%20is%20visible%20for%20this%20identifier%2C%20the%20identifier%20is%0D%0Aimplicitly%20declared%20exactly%20as%20if%2C%20in%20the%20innermost%20block%20containing%0D%0Athe%20function%20call%2C%20the%20declaration%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20extern%20int%20%20identifier()%3B

user: user-9
content: 楼主没有搞清楚状况吧！  谁说C语言不要求前导声明啊，那叫隐式声明。  C99就不说了，二十多年前的C89就说的清清楚楚：     If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration           extern int  identifier();
user-0 提问: 为结构体数组中的字符指针循环赋值的问题

回复:
user: user-0
content: 引用 8 楼 zxh707wk 的回复:在给name复制前开辟一个空间 #include <stdio.h> #include <string.h> #include <malloc.h>  struct stu { 	int num; 	char* name; 	char sex; 	float score; };  int main(int argc, char* argv[])  { 	struct stu* p; 	int i; 	char str[20]; 	char ss[20] = "lucy"; 	char s[20]; 	p = (struct stu *)calloc(5, sizeof(struct stu)); 	for(i=0; i<5; i++) 	{ 		p->name=(char*)malloc(sizeof(char)*20); 		sprintf(str, "%d", i);  		strcpy(s, ss); 		strcat(s, str); 		strcpy(p->name, s); 		p++; 	} 	for(i=5; i>0; i--) 	{ 		--p; 		printf("%s\n", p->name); 	}	  	return 0; }  谢谢，这个正是我想要的效果呢！ 我早上5点钟就爬起来研究这个问题，当name是char *类型时，用strcpy(p->name, s);就会报错。原来是要先为p->name申请个内存空间，将其转换为数组，才行的。

user: user-1
content: 在给name复制前开辟一个空间 #include <stdio.h> #include <string.h> #include <malloc.h>  struct stu { 	int num; 	char* name; 	char sex; 	float score; };  int main(int argc, char* argv[])  { 	struct stu* p; 	int i; 	char str[20]; 	char ss[20] = "lucy"; 	char s[20]; 	p = (struct stu *)calloc(5, sizeof(struct stu)); 	for(i=0; i<5; i++) 	{ 		p->name=(char*)malloc(sizeof(char)*20); 		sprintf(str, "%d", i);  		strcpy(s, ss); 		strcat(s, str); 		strcpy(p->name, s); 		p++; 	} 	for(i=5; i>0; i--) 	{ 		--p; 		printf("%s\n", p->name); 	}	  	return 0; }

user: user-1
content: 引用 5 楼 baichi4141 的回复:p++->name=ss; 为什么那么多人喜欢用=复制字符串这个是用指针指向，不是复制

user: user-0
content: 引用 5 楼 baichi4141 的回复:p++->name=ss; 为什么那么多人喜欢用=复制字符串  我是新手呵呵，一般正式开发中，怎样复制字符串呢？用malloc，strcpy还是memcpy？或者另外声明个全局字符数组？

user: user-2
content: p++->name=ss; 为什么那么多人喜欢用=复制字符串

user: user-0
content: 引用 2 楼 anshiny 的回复:int main(int argc, char* argv[]) { 	struct stu{ 		int num; 		char name[20]; 		char sex; 		float score; 	} *p; 	int i; 	char str[5]; 	char ss[5] = "lucy"; 	char s[10]; 	 	p = (struct stu *)calloc(5, sizeof(struct stu));  	for(i=0; i<5; i++){ 		sprintf(str, "%d", i);  		strcpy(s, "lucy"); 		strcat(s, str); 		strcpy(p->name, s); 		p++; 	} 	 	for(i=5; i>0; i--){ 		--p; 		printf("%s\n", p->name); 	} 	 	return 0; }  你这里把str.name的类型由char *改成了char []，如果不改变原来的类型，则strcpy(p->name, s);无法使用，该怎样处理呢?

user: user-0
content: 引用 1 楼 user-4 的回复:要做什么？ 如果是要解决局部量问题，那就扩大它的定义域，把它从循环体中拿出来 如果是要生成五个name，那就要有五个字符串容身的存储空间----只用一个ss数组能存储五个字符串？  这个也是种解决办法，在外面定义一个5个长度的字符数组，有没有更好点的办法呢？

user: user-3
content: int main(int argc, char* argv[]) { 	struct stu{ 		int num; 		char name[20]; 		char sex; 		float score; 	} *p; 	int i; 	char str[5]; 	char ss[5] = "lucy"; 	char s[10]; 	 	p = (struct stu *)calloc(5, sizeof(struct stu));  	for(i=0; i<5; i++){ 		sprintf(str, "%d", i);  		strcpy(s, "lucy"); 		strcat(s, str); 		strcpy(p->name, s); 		p++; 	} 	 	for(i=5; i>0; i--){ 		--p; 		printf("%s\n", p->name); 	} 	 	return 0; }

user: user-4
content: 要做什么？ 如果是要解决局部量问题，那就扩大它的定义域，把它从循环体中拿出来 如果是要生成五个name，那就要有五个字符串容身的存储空间----只用一个ss数组能存储五个字符串？
user-0 提问: windows有没有类似linux中的poll函数

回复:
user: user-1
content: Windows下于串口异步通信，需要重叠I/O(Overlapped I/O)，操作完成会有Event通知，用WaitForSingleObject来等。看这篇文章吧： Serial Communications

user: user-2
content: windows有IOCP, 真正的异步IO

user: user-3
content: 参考： MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.DSP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.RES MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.RC MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\MAKEFILE MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\VERSION.H MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\RESOURCE.H MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.H MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.C MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\README.TXT MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.ICO MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.BMP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\SERIAL\TTY.DEF
user-0 提问: c语言编写函数 输入一个整数  输出对应的字符串

回复:
user: user-1
content: 前辈们 ： while(1) 是什么意思啊

user: user-2
content: 引用 1 楼 czarten 的回复:如果整数是从１开始连续的，搞个字符指针数组就好了嗯，如果不是的话，用switch也行

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> char s[3][20]={     "It is error!",     "It is ok!",     "It may ok.", }; int main() {     int i;      while (1) {         printf("Input a number(0..2):");         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&i)) {             if (0<=i && i<=2) {                 printf("%s\n",s[i]);                 continue;             }         }         printf("Format error!\n");         break;     }     return 0; } //Input a number(0..2):0 //It is error! //Input a number(0..2):1 //It is ok! //Input a number(0..2):2 //It may ok. //Input a number(0..2):3 //Format error! //

user: user-3
content: #include <stdio.h> #include <string.h> char s[3][20]={     "It is error!",     "It is ok!",     "It may ok.", }; int main() {     int i;      while (1) {         printf("Input a number(0..2):");         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&i)) {             if (0<=i && i<=2) {                 printf("%s\n",s[i]);                 continue;             }         }         printf("Format error!\n");         break;     }     return 0; } //Input a number(0..2):0 //It is error! //Input a number(0..2):1 //It is ok! //Input a number(0..2):2 //It may ok. //Input a number(0..2):3 //Format error! //

user: user-0
content: 引用 1 楼 czarten 的回复:如果整数是从１开始连续的，搞个字符指针数组就好了 我是刚开始学，不知道该怎么用，能不能写的例子给我看看一下呢，谢谢！

user: user-3
content: 用c++的map<string,int> simap;

user: user-4
content: 引用 2 楼 victor1960 的回复:[quote=引用 1 楼 czarten 的回复:] 如果整数是从１开始连续的，搞个字符指针数组就好了  顶一个[/quote] 顶

user: user-5
content: 引用 1 楼 czarten 的回复:如果整数是从１开始连续的，搞个字符指针数组就好了  顶一个

user: user-6
content: 如果整数是从１开始连续的，搞个字符指针数组就好了
user-0 提问: 编程题：小明的筷子

回复:
user: user-1
content: 当数组中出现元素0的时候，表示数量错误，返回-1 当数组中，有两个以上奇数个统一长度的筷子时候，表示漏掉不止一根，返回 第一个奇数个的长度好了 当筷子全部成对的时候，表示没有漏掉，或者出错，返回 -1

user: user-2
content: int tmp[SIZE]={} for(int i=0;i<Input.length;i++) {       tmp[i]++; }  for(int i=0;i<SIZE;i++) {      if(tmp[i]==1)      {            //find      } }  这是伪代码，大家看看如何？

user: user-2
content: 哦，明白了明白了，原来是一系列数不能组成对的多出来的那根 啊

user: user-2
content: 我怎么没看懂，怎么漏掉的？查找的规则是什么？

user: user-3
content: 你这个输入固定了 和题目要求不符吧

user: user-4
content: 若筷子不是金箍棒一样长的话 用位图法再简单不过了 判断是奇数的就是少了的一跟筷子了

user: user-5
content: 试改2行:   for(i = 0; i < arraySize; i ++) //改 for(i = 0; i < arraySize && 0 != chopsticks[i]; i ++)   {     if(0 != chopsticks[i]) for(j = i + 1; j < arraySize; j++) //改 for(j = i + 1; j < arraySize; j++)     {       if(chopsticks[i] == chopsticks[j])       {         chopsticks[i] = chopsticks[j] = 0;         count++;         break;       }     }   }

user: user-6
content: 用数组下标存值 /* 小明是个马大哈，某天他到超市买了若干双筷子（n < 20） 筷子的长度不尽相同，他把全部筷子都放在购物袋里面拿回家，路上不小心漏了一根 请你用程序帮他找出是漏掉的筷子是多长的。   输入：  剩下的筷子数组，如：1, 2, 3, 2, 1, 3, 2 返回值：漏掉的筷子长度，如上述输入返回：2（当输入的筷子数据异常时返回-1，如：找不到漏掉的筷子）   */ #include <stdio.h>  #define MAX_LEN 20  int find_lost_chopsticks(int a[],int num) { 	int len[MAX_LEN+1]={0}; 	int i; 	for(i=0;i< num;i++) 	{ 		len[a[i]]++; 		if(len[a[i]]==2)len[a[i]]=0; 	} 	for(i=1;i<MAX_LEN+1;i++) 	{ 		if(len[i])return i; 	} 	return -1; }  int main() { 	int a[]={1, 2, 3, 2, 1, 3, 2}; 	printf("%d\n",find_lost_chopsticks(a,sizeof(a)/sizeof(int))); 	return 0; }

user: user-7
content: 排序+计数

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:n双 能帮我分析上上面的代码有什么疏漏吗？

user: user-8
content: 如果只漏了1根筷子，则只需要将剩余筷子的长度依次异或，结果即为漏掉的那根筷子的长度；  如果漏了k根筷子，且k>=1，那么当k为偶数时，问题可能无解。例如漏了2根筷子，且其长度相同。

user: user-9
content: n双
user-0 提问: [求助]c语言中的system的一个问题

回复:
user: user-0
content: 引用 6 楼 user-1 的回复:在你的第一个system之前加一行 fflush(fpart) 再试试，这个函数是强制把内存缓冲区写入文件的  厉害！！！ 多谢啦！ 你说的很对！

user: user-1
content: 在你的第一个system之前加一行 fflush(fpart) 再试试，这个函数是强制把内存缓冲区写入文件的

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 damaoshan 的回复:] 照这么看，有没有可能，fclose之前，也已经写到了硬盘？ 或者说只是个时间的问题？ 一切皆有可能。这个有点像复制文件到u盘 [/quote] 一般来讲，为什么需要fclose呢？ 假设不fclose不可以吗？

user: user-1
content: 引用 2 楼 damaoshan 的回复:另外，既然fclose之前，不能保证数据写入硬盘，那么fclose之前就不能对所谓的写入文件做有关操作了？ 这个我不太确定，可能也要看你怎么操作吧，如果是同一个fp我觉得问题不大

user: user-1
content: 引用 2 楼 damaoshan 的回复:照这么看，有没有可能，fclose之前，也已经写到了硬盘？ 或者说只是个时间的问题？ 一切皆有可能。这个有点像复制文件到u盘

user: user-0
content: @user-1  “这个和system没关系，关键在于fclose的作用。fwrite写的东西可能还在内存缓冲区里，没写到硬盘，只有fclose之后才确保写入文件了 ” 照这么看，有没有可能，fclose之前，也已经写到了硬盘？ 或者说只是个时间的问题？  另外，既然fclose之前，不能保证数据写入硬盘，那么fclose之前就不能对所谓的写入文件做有关操作了？

user: user-1
content: 这个和system没关系，关键在于fclose的作用。fwrite写的东西可能还在内存缓冲区里，没写到硬盘，只有fclose之后才确保写入文件了
user-0 提问: shiyan.exe 中的 0x502ff4a5 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000064 

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-2
content: WORD *word=new WORD[word_max];    //结构体类型数组, 上面一行的new是什么意思，为何我这里显示没有定义？
user-0 提问: 以下指针指向字符串与数组存储字符串的区别是什么？

回复:
user: user-1
content: 第一个指针p指向的字符串是存放在常量区，所以试图修改字符串是错误的，p[1]='a'会出现内存错误 相反，第二个字符数组是可以修改的

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

user: user-0
content: 非常感谢大家的帮助！

user: user-3
content: http://www.cnblogs.com/Logic0/archive/2009/08/01/1850337.html

user: user-4
content: 第一个当中的p是一个指针，指向一个静态分配的只读字符串。 第二个当中的p是一个字符数组。
user-0 提问: BUG求大神看看

回复:
user: user-1
content: 引用 3 楼 u014313894 的回复:恩，可是我已今天头疼一阵时间了  范围很大，而且功能很多，操作也不少，你说一下bug发生的条件，进行了什么操作会出现问题等等。。

user: user-2
content: 代码太长了，下断点调试下看看

user: user-3
content: Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-4
content: 在你出错的那两个函数设个断点，然后单步执行。另外，你这个程序的函数参数都是结构体啊，都没用指针，修改信息什么的肯定没生效。

user: user-5
content: 在出错地儿加几个断点

user: user-0
content: 恩，可是我已今天头疼一阵时间了

user: user-1
content: 先缩小发生的条件，然后一步一步调试吧，问题自己找出来进步会最大化。

user: user-6
content: 代码太多了
user-0 提问: 求助各位了，大家快来帮帮忙啊

回复:
user: user-1
content: 简单啊！用一个通过地址访问数据而已

user: user-2
content: 不知道是不是 #include <stdio.h> #include <malloc.h>  int main() { 	int* a[3]; 	int i; 	int j; 	int temp; 	for(i=0;i<3;i++) 	{ 		a[i]=(int*)malloc(sizeof(int)); 		scanf("%d",a[i]); 	} 	for(i=0;i<2;i++) 	{ 		for(j=0;j<2;j++) 		{ 			if(*a[j]>*a[j+1]) 			{ 				temp=*a[j]; 				*a[j]=*a[j+1]; 				*a[j+1]=temp; 			} 		} 	} 	printf("%d:%d:%d\n",*a[0],*a[1],*a[2]); 	return 0; }

user: user-3
content: 引用 1 楼 user-4 的回复:消灭 0 回复。 这是求源代码呀。 说思路 定义多维数组 , scanf 获取输入，然后指针做比较大小输出。 楼上的可以帮我消灭我帖子http://bbs.csdn.net/topics/390805950的0回复么，谢谢！

user: user-4
content: 消灭 0 回复。 这是求源代码呀。 说思路 定义多维数组 , scanf 获取输入，然后指针做比较大小输出。
user-0 提问: 弱弱的问一个问题

回复:
user: user-0
content: #include<stdio.h> #include<conio.h>  int main(void) { 	printf("Thanks a lot!\n"); 	getch();  	return (0); }

user: user-1
content: hi dream    在发帖子的上方有一行是字体，表情等选择按钮。 中间有个 选择需要的语言，然后把代码复制到框里面就OK了
user-0 提问: 寄存器  内存 volatile  static

回复:
user: user-0
content: 引用 3 楼 taodm 的回复:是副本到本体间有个同步的过程。 写的同步时间不确定。 读的同步可以被优化。 另外，找本好点的教材吧，没事别乱看网文。  请问你是参考的哪本书？有什么推荐？感谢！

user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 是副本到本体间有个同步的过程。 写的同步时间不确定。 读的同步可以被优化。 另外，找本好点的教材吧，没事别乱看网文。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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-0 提问: 字节存储顺序  大小端问题

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 引用 2 楼 zhao4zhong1 的回复:typedef struct bitstruct { int b1 : 5; int : 2; int b2 : 2; }biistruct; 和 typedef struct bitstruct { unsigned int b1 : 5; unsigned int : 2; unsigned int b2 : 2; }biistruct; 不是一回事！   赵老师，你也特不给力了，发些灌水的有意思么？

user: user-0
content: 引用 3 楼 a775992553 的回复:问题一跟问题二就一样么。。其实补码是为了在计算机中表示负数。字母对应的全是ASCII码值，都是正数，所以没必要硬是要说是按原码还是补码。存储方式是第一种，打断小段是针对字节的，不是针对位的。 其实你可以输出更多信息，这样你自己就能通过结果推敲出好多结论。比如。把那个sizeof(b)输出，还有 printf("%x, %x\n", b.b1, b.b2); printf("%p, %p\n",&( b.b1), &(b.b2)); 等等。  其实不是第一种，在面试宝典中 是第二种 。。

user: user-2
content: 问题一跟问题二就一样么。。其实补码是为了在计算机中表示负数。字母对应的全是ASCII码值，都是正数，所以没必要硬是要说是按原码还是补码。存储方式是第一种，打断小段是针对字节的，不是针对位的。 其实你可以输出更多信息，这样你自己就能通过结果推敲出好多结论。比如。把那个sizeof(b)输出，还有 printf("%x, %x\n", b.b1, b.b2); printf("%p, %p\n",&( b.b1), &(b.b2)); 等等。

user: user-3
content: typedef struct bitstruct { int b1 : 5; int : 2; int b2 : 2; }biistruct; 和 typedef struct bitstruct { unsigned int b1 : 5; unsigned int : 2; unsigned int b2 : 2; }biistruct; 不是一回事！

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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-0 提问: 堆排序中的一个函数有点不懂

回复:
user: user-0
content: 大概理解了，谢谢大家！

user: user-1
content: 引用 4 楼 TreeCare 的回复:如何交换呢？  (a^b)^b  这个值就是a;  一个值异或其他的值，然后再异或这个其他的值，还是它本身。

user: user-2
content: #include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-2
content: 引用 5 楼 zxh707wk 的回复:异或运算，这个老师讲过，和那个a=a+b; b=a-b; a=a-b;一样的，能交换两个数的值 这个会溢出。

user: user-3
content: 异或运算，这个老师讲过，和那个a=a+b; b=a-b; a=a-b;一样的，能交换两个数的值

user: user-0
content: 如何交换呢？

user: user-4
content: 这是异或运算

user: user-1
content: 引用 1 楼 xuzhouweihao 的回复:异或，  交换 a和b的值 函数的功能是交换a和b的值

user: user-1
content: 异或，  交换 a和b的值
user-0 提问: 关于指针的题目

回复:
user: user-1
content: 指针的只能指向本程序的数据区，地址空间是操作系统分配的，不能赋直接地址给指针。 如果直接地址指向的是非本程序的地址空间，进程想访问该空间时，就会被操作系统杀掉。

user: user-2
content: 理论上的分析，前面的各位大虾都分析过了。作为bird的我就来实践验证一下吧！欢迎大虾帮忙指点一下。特别是那个warning。 #include<stdio.h> #include<conio.h>  int main(void) { 	int *i=0x1234; 	int* p; 	p=i+1;  	printf("i=%x\np=%x\n",i,p);  	getch();  	return (0); } Ctrl+F7 编译当前文件后(1 warning)：   F7 编译工程后(正常)：   F5 调试执行后：    如果代码里要输出*i ,增加一行：printf("*i=%x\n",*i);  Ctrl+F7 编译当前文件后(1 warning)：   F7 编译工程后(正常)：   F5 调试执行后：除了会显示先前同样的DOS界面框还会弹出：   点击“确定”后，新增代码行多了一个黄色箭头：

user: user-3
content: 引用 8 楼 duxd1989 的回复:[quote=引用 4 楼 buyong 的回复:] int  *i = 0x1234; 一般不能编译，强制转换后p=0x1238 确实不能编译  怎么进行强制转换[/quote] int  *i = (int *)0x1234;

user: user-4
content: 同上，i地址为0x1234,*i 由于地址内容未知无法确定 i和p都为int*类型指针，int指针占用4个字节/32位系统所以 p = 0x1238

user: user-5
content: i  为0x1234; *i为 某个数值 即 0x1234 处存储的内容的整数值 p为 0x1238

user: user-0
content: 引用 4 楼 buyong 的回复:int  *i = 0x1234; 一般不能编译，强制转换后p=0x1238 确实不能编译  怎么进行强制转换

user: user-6
content: *i 可能不能获取。因为0x1234 可能是保护的。这样赋值的只能除非特殊情况，否者就是野指针。 p = 0x1235.

user: user-7
content: 指针不能直接这样赋值啊 int  *i = 0x1234;

user: user-8
content: 为嘛研究这种现实完全错误的用法呢

user: user-9
content: int  *i = 0x1234; 一般不能编译，强制转换后p=0x1238

user: user-10
content: 自己打印下吧。考查指针的算术运算！

user: user-11
content: i=0x1234 p=0x1238 因为i的类型是int*，所以i+1加的是一个int的长度4

user: user-12
content: i = 0x1234 *i 未定义，访问可能出现内存错误 p = 0x1238
user-0 提问: 大家帮我看看，为什么pthread_create没有定义，在gcc运行时

回复:
user: user-1
content: gcc -Wall -c "001.c"  001.c: In function ‘main’: 001.c:21:4: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]     sleep(1);     ^ 001.c: In function ‘task’: 001.c:10:1: warning: control reaches end of non-void function [-Wreturn-type]  }  ^ 编译成功结束。

user: user-2
content: gcc编译时添加链接选项-lpthread可以解决

user: user-0
content: 大家帮我看看，为什么pthread_create没有定义，在gcc运行时
user-0 提问: 水仙花数 C语言求教

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

回复:
user: user-0
content: 谢谢前辈们，我有点明白了》

user: user-1
content: 这两个问题都涉及关于C语言sequence point（顺序点）。可以看看这个帖子http://www.chinaunix.net/old_jh/23/310576.html了解。  详细的定义可以在C语言标准的6.5章Expressions找到。  简单的说，像（a++）+（a++）+（a++）+（a++）这样的表达式对于C语言来说是未定义的，也就是一个不合乎标准的表达式。因为在多个a++表达式之间没有序列点来保证side effect的顺序。  如果你用gcc编译器对类似的表达式进行编译，就能够看到有警告关于sequence point.  [wangw33@localhost tmp]$ cat main.c int main() {     int a = 0;     int x = (a++) + (a++);     return x; } [wangw33@localhost tmp]$ gcc -Wall -o main main.c main.c: In function 'main': main.c:4:23: warning: operation on 'a' may be undefined [-Wsequence-point] <---警告      int x = (a++) + (a++);

user: user-2
content: 楼主自己认真去看置顶帖。

user: user-0
content: 求底层原因？

user: user-0
content: 主要是++号多了就乱了，但底层原因是什么呢?

user: user-1
content: 补充：前面的引用来自于C语言标准Programming languages — C  ISO/IEC 9899:201x

user: user-1
content: C语言  EXAMPLE In the function call (*pf[f1()]) (f2(), f3() + f4()) the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before the function pointed to by pf[f1()] is called.  可以说对于函数参数的计算是没有固定顺序的，编译器完全可以按从右到左的顺序去计算参数的值，这样就会产生你看到的现象。

user: user-0
content: 这个加号好奇怪

user: user-0
content: 我又想起另一个:               a =1;               输出 （a++）+（a++）+（a++）+（a++） 结果得到了15，为什么呢？

user: user-3
content: 不应该是 1 1 2  吗

user: user-4
content: 输出有顺序的，windows下linux刚好相反的！而且i++是之后的效果的！

user: user-0
content: 好奇怪，怎么解释呢？

user: user-0
content: 我这结果是： 1    2      3 2    1      1
user-0 提问: C语言可以编写抢票软件吗

回复:
user: user-1
content: 有人可以制作一个抢交警队下来的科目一，科目二指标吗？

user: user-2
content: 一群白痴，如果你会多线程跟HTTP协议。分分钟搞定

user: user-3
content: 请问楼主现在进行到哪一步了呢？

user: user-4
content: 就是模拟发出去的数据，基本都是socket编程。主要是抓包分析，那些数据需要自己发送出去。

user: user-5
content: 可以，好费劲的

user: user-0
content: 引用 26 楼 weiwei2012start 的回复:可以，以前尝试过。编程繁琐吗？具体该怎么做啊？

user: user-4
content: 可以，以前尝试过。

user: user-0
content: 引用 20 楼 zhao4zhong1 的回复:http://www.autohotkey.com点击进去了，但是下载不了，层主有文件吗？

user: user-0
content: 引用 23 楼 klmn111aaa 的回复:引用 17 楼 oooiiioooo 的回复:[quote=引用 15 楼 klmn111aaa 的回复:] [quote=引用 10 楼 oooiiioooo 的回复:] [quote=引用 3 楼 lthyxy 的回复:] 不好写. 还是用脚本之类的语言写吧. 比如python.会没学，本来想先学完C语言后写个抢课软件的，，，但是现在看来单靠C语言很难写出来，python这门语言听过，学过C语言后容易上手吗？还是直接学python好？  我们学校就有人写抢课软件。。。[/quote]哇，哇，哇！有代码吗？或者程序，拿来参考和学习，我的邮箱hj192890@126.com谢谢[/quote] 有，但这个得经过作者同意。。。网上也有，你搜搜吧。[/quote]恩恩，谢谢

user: user-6
content: 引用 4 楼 u012421456 的回复:C语言据说几乎无所不能，但在很多情况下，都会非常的麻烦，所以才有了面向对象的语言、脚本语言、结构化语言等等 原来C不是结构化语言

user: user-7
content: http://www.autohotkey.com

user: user-8
content: 抢票软件使用脚本语言写比较方便吧，C语言也是可以实现滴。有的话共享下呗！

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  做个可能不太恰当的比喻： 人想让狗帮忙逮只兔子，可是人说话狗听不懂，于是人发明了一种介乎人言和狗语之间的语言，即口令。 人想让电脑帮忙做计算，可是人话电脑听不懂，于是人发明了一种介乎人言和汇编机器码之间的语言，即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。比喻的很好，措中要点，看来要学习另一门语言才能实现我的这个想法，师兄有哪门比较好的语言推荐的吗？

user: user-0
content: 引用 15 楼 klmn111aaa 的回复:引用 10 楼 oooiiioooo 的回复:[quote=引用 3 楼 lthyxy 的回复:] 不好写. 还是用脚本之类的语言写吧. 比如python.会没学，本来想先学完C语言后写个抢课软件的，，，但是现在看来单靠C语言很难写出来，python这门语言听过，学过C语言后容易上手吗？还是直接学python好？  我们学校就有人写抢课软件。。。[/quote]哇，哇，哇！有代码吗？或者程序，拿来参考和学习，我的邮箱hj192890@126.com谢谢

user: user-0
content: 引用 14 楼 u012421456 的回复:[quote=引用 8 楼 oooiiioooo 的回复:] 不敢当，我也只是个新手    引用 11 楼 oooiiioooo 的回复:我想写个抢课的软件，C语言刚入门，是继续往下学还是换方向？ 请问楼主有其他语言基础吗？如果仅仅是C语言刚刚入门，那建议现在还是不要想这个抢课软件的事，要走的路还很长啊[/quote]  引用 14 楼 u012421456 的回复:[quote=引用 8 楼 oooiiioooo 的回复:] 不敢当，我也只是个新手    引用 11 楼 oooiiioooo 的回复:我想写个抢课的软件，C语言刚入门，是继续往下学还是换方向？ 请问楼主有其他语言基础吗？如果仅仅是C语言刚刚入门，那建议现在还是不要想这个抢课软件的事，要走的路还很长啊[/quote]没有了，非计算机专业的，自学的C语言，目前刚刚到函数这里，谢谢师兄的建议，师兄谦虚了，希望以后师兄能多多帮助

user: user-9
content: 引用 10 楼 oooiiioooo 的回复:引用 3 楼 lthyxy 的回复:不好写. 还是用脚本之类的语言写吧. 比如python.会没学，本来想先学完C语言后写个抢课软件的，，，但是现在看来单靠C语言很难写出来，python这门语言听过，学过C语言后容易上手吗？还是直接学python好？  我们学校就有人写抢课软件。。。

user: user-9
content: 引用 17 楼 oooiiioooo 的回复:引用 15 楼 klmn111aaa 的回复:[quote=引用 10 楼 oooiiioooo 的回复:] [quote=引用 3 楼 lthyxy 的回复:] 不好写. 还是用脚本之类的语言写吧. 比如python.会没学，本来想先学完C语言后写个抢课软件的，，，但是现在看来单靠C语言很难写出来，python这门语言听过，学过C语言后容易上手吗？还是直接学python好？  我们学校就有人写抢课软件。。。[/quote]哇，哇，哇！有代码吗？或者程序，拿来参考和学习，我的邮箱hj192890@126.com谢谢[/quote] 有，但这个得经过作者同意。。。网上也有，你搜搜吧。

user: user-10
content: 引用 21 楼 Adol1111 的回复:[quote=引用 4 楼 u012421456 的回复:] C语言据说几乎无所不能，但在很多情况下，都会非常的麻烦，所以才有了面向对象的语言、脚本语言、结构化语言等等 原来C不是结构化语言[/quote] 说错了，那个是想说数据库语言

user: user-10
content: 引用 8 楼 oooiiioooo 的回复: 不敢当，我也只是个新手    引用 11 楼 oooiiioooo 的回复:我想写个抢课的软件，C语言刚入门，是继续往下学还是换方向？ 请问楼主有其他语言基础吗？如果仅仅是C语言刚刚入门，那建议现在还是不要想这个抢课软件的事，要走的路还很长啊

user: user-11
content: 引用 1 楼 max_min_ 的回复:可以！骑自行车也可以到罗马的！  穿篮球鞋也可以踢足球的
user-0 提问: 求助大神，帮忙编程

回复:
user: user-0
content: 引用 8 楼 czarten 的回复:解个方程组你写什么程序，能写程序就说明已经知道解的流程了那如果是用线性规划求解，不是直接解方程组呢？

user: user-0
content: 引用 7 楼 daiweifeng 的回复:[quote=引用 6 楼 daiweifeng 的回复:] [quote=引用 5 楼 u012925092 的回复:] 我想编程知道变量都为多少时，Z取min  多元一次方程组？ [/quote]  线性规划？[/quote]是的，线性规划，就是他

user: user-1
content: 解个方程组你写什么程序，能写程序就说明已经知道解的流程了

user: user-2
content: 引用 6 楼 daiweifeng 的回复:[quote=引用 5 楼 u012925092 的回复:] 我想编程知道变量都为多少时，Z取min  多元一次方程组？ [/quote]  线性规划？

user: user-2
content: 引用 5 楼 u012925092 的回复:我想编程知道变量都为多少时，Z取min  多元一次方程组？

user: user-0
content: 我想编程知道变量都为多少时，Z取min

user: user-0
content: 引用 11 楼 my_live_123 的回复:推荐使用lingo数学软件求解此类线性规划问题lingo算出结果了，可是老师还让自己编程算一遍

user: user-3
content: 推荐使用lingo数学软件求解此类线性规划问题

user: user-4
content: 不清楚楼主想让干嘛

user: user-5
content: 一个一个来！化整为零，然后再化零为整

user: user-6
content: 还是不清楚你想说啥

user: user-0
content: 里面X都是变量，不是乘号。原先学过可是现在都不记得了…… 希望大家可以帮忙
user-0 提问: 一个关于算法的问题

回复:
user: user-1
content: T(N) =O(f(N)) <= c * f(N) 这个就是时间复杂度，和操作的频度的关系。 T(N) =O(f(N)) 是时间复杂度 O(f(N)) <= c * f(N)  c * f(N) 是 基本操作的频度。

user: user-2
content: n^2 相当于执行了n^2条 语句， n=1000   用时 1S 那一条语句就是 1/10^6 秒  n=10^6 时,一共执行n^12条 语句，用时就是10^12 * 1/10^6 = 10^6秒

user: user-3
content: 理论上需要运行10^6秒，实际上程序可能由于内存资源不足而无法正常运行，另外10^6秒已经超过了11天，停电、软硬件故障等原因也可能导致无法完成计算。

user: user-4
content: 算错了，是10^6秒

user: user-5
content: 10^3^2秒。

user: user-6
content: 10000s

user: user-4
content: 运行了10^3秒
user-0 提问: 求大神们解答啊   一天了没整明白

回复:
user: user-1
content: 引用 楼主 wwh2259253 的回复:错误信息：--------------------Configuration: 1 - Win32 Debug-------------------- Compiling... 1.c D:\学籍信息管理系统\1.c(239) : error C2120: 'void' illegal with all types D:\学籍信息管理系统\1.c(288) : error C2120: 'void' illegal with all types D:\学籍信息管理系统\1.c(313) : error C2040: 'Locate' : 'struct node *(struct node *,char *)' differs in levels of indirection from 'void ()' 执行 cl.exe 时出错.  1.obj - 1 error(s), 0 warning(s) 就像一楼说的，要学会查看编译器的报错提示

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

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

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

user: user-4
content: 检查代码的239和288行，void后面不能再和其它的类型写在一起。  检查代码的313行 Locate的定义是Node* Locate(Link L,char ID[]);  而不是void Locate();  抄个作业都抄得乱七八糟的。
user-0 提问: 求论坛大神解释，这究竟是什么原因

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 谢3、4、5楼大神指点！

user: user-0
content: 事实真相：

user: user-2
content: 对比两者操作的差别和权限

user: user-3
content: 引用 4 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。+1

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 【文件b的大小】=【文件a的大小】乘以2再加2 一个是ASCII编码，一个是UNICODE编码 简单的说，一个字符在ASCII编码里使用一个字节，在UNICODE编码里使用两个字节，所以大小差了一倍，而UNICODE编码的文本文件需要在开头加上0xFF0xFE两个字节，结果就是第一行的大小关系 至于为啥读不进程序里，因为你在使用最基础的ASCII编码的文本文件操作函数

user: user-5
content: 你给我两个txt，然后问我为什么大小相差那么多？

user: user-6
content: 看不懂你的文件，不明白你问的。抱歉
user-0 提问: 文本值替换出错,麻烦大家看下

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-0
content: 晕,结不到贴

user: user-0
content: 引用 1 楼 Indestiny 的回复:char new_name; 我觉得这句是个坑 是的,　你说对了

user: user-2
content: char new_name; 我觉得这句是个坑
user-0 提问: 帮看看，求算术表达式括号补全问题的代码哪错了

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: windows程序设计------BLOKOUT1(新手)

回复:
user: user-1
content: VC6： Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received.  Note   Message breakpoints work only on x86- or Pentium-based systems.  To set a breakpoint on a message   From the Edit menu, click Breakpoints.  The Breakpoints dialog box appears.  Click the Messages tab.   In the Break At WndProc text box, type the name of the Windows function.  If you are setting a breakpoint during a debug session, the list contains the exported functions in your project.   In the Set One Breakpoint For Each Message To Watch list box, select the message.   To set another breakpoint, press ENTER, and then repeat steps 3 and 4.  The Breakpoints list displays the currently active breakpoints.  Click OK to set the breakpoints.  Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.

user: user-2
content: 单步调试，这个只靠想不行

user: user-0
content: 我想了好久都没有想出来,   是不是沉了?
user-0 提问: 用C语言实现以下功能

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

user: user-2
content: baidu一下socket编程，现成代码大把

user: user-3
content: 为什么不直接在客户端计算1到100之间的所有奇数和？
user-0 提问: 一个c程序--字符类型统计器

回复:
user: user-1
content: int space=0,tab=0,enter=0; 	while(scanf("%c",&c) !=EOF) 	{ 		switch(c) 		{ 		case 32: 			space++; 			break; 		case 9: 			tab++; 			break; 		case 10: 			enter++; 			break; 		default:break; 		} 	} 	printf("space=%d\n",space); 	printf("tab=%d\n",tab);

user: user-2
content: 引用 1 楼 u011916318 的回复:这个程序执行后没有结果，程序是没有问题的，请问为什么？既然没有结果，怎么可能没问题呢

user: user-0
content: 这个程序执行后没有结果，程序是没有问题的，请问为什么？
user-0 提问: SQL删除重复数据的问题

回复:
user: user-1
content: delete里表不能用别名

user: user-1
content: delete from [wyz].[dbo].[ghsj]  where ([付款账号],[收款账号] ，[交易金额],[交易日期]) in (select [付款账号],[收款账号],[交易金额],[交易日期] from [wyz].[dbo].[ghsj] group by [付款账号],[收款账号],[交易金额],[交易日期] having count(*)>1) and [bh] not in (select min([bh]) from [wyz].[dbo].[ghsj] group by [付款账号],[收款账号],[交易金额],[交易日期] having count(*)>1)

user: user-0
content: 坐等大神啊！！

user: user-0
content: 我用的是server 2012
user-0 提问: C语言字符数组的一个简单问题

回复:
user: user-1
content: 字符和ascii码问题

user: user-2
content: 引用 10 楼 u013163178 的回复:[quote=引用 3 楼 zxh707wk 的回复:] 这个算法在计算重复字符的时候很好。。。 能不能说说如何计算重复字符啊[/quote] 仅供参考 #include <stdio.h>  int check_c(int c) { 	if(c>='a'&&c<='z')return 1; 	if(c>='A'&&c<='Z')return 1; 	return 0; }  int main() { 	char str[]="adfsdfwejkjksdnkxcvkjzhfgjahtwoisdkjfksd"; 	int num[127]={0}; 	int i; 	for(i=0;str[i];i++) 	{ 		num[(int)str[i]]++; 	} 	for(i=1;i<128;i++) 	{ 		if(check_c(i))printf("字符%c有%2d个\n",i,num[i]); 	} 	return 0;	 }

user: user-3
content: 如果想更好的学习C语言  我建议去 www.clang.cc   cc 提供专业的视频教学  我是受益很多

user: user-4
content: 'A' = 65,'a'=97可以查ASCii表，内存中字符型是用整形来存放的

user: user-5
content: 理解和讨论之前请先学会如何观察！

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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-6
content: 引用 3 楼 zxh707wk 的回复:这个算法在计算重复字符的时候很好。。。 能不能说说如何计算重复字符啊

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  嗯，多谢！

user: user-5
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: @u013797412  @waitianlou  @zxh707wk  @oYinGui1   大谢各位！

user: user-2
content: 这个算法在计算重复字符的时候很好。。。

user: user-7
content: char也是整型，可以隐式转换。

user: user-8
content: memset(L, 0, 256);  //相当于数组L全部赋值0      L['A'] = L['a'] = 0;        //L[64]=L[97] = 0 这是因为 'A'的ASCII码值为64,'a'的ASCII值为97,下面可以自己查ASCII码表了      L['C'] = L['c'] = 1;         L['G'] = L['g'] = 2;      L['T'] = L['t'] = 3;

user: user-9
content: 去查 ascii 码表 童鞋
user-0 提问: c语言移位运算符">>"的疑问

回复:
user: user-1
content: 这是因为一个常量值，除非太大，都会被编译器用一个int来存储，如x & 0xff中的0xff，于是x 提升为一个int(高位补0)与0xff按位与后，再移位，自然是高位补0的 如果有 char flag = 0xff; 那么 x>>1, (x & 0xff) >> 1) 就是一样的了
user-0 提问: C语言字符串搜索的问题

回复:
user: user-1
content: //一个字符串 //"{\"jd_clouds_sm_jb_file_list_responce\":{\"code\":\"0\",\"receive_result\":{\"code\":\"200\",\"data\":\"{\"files\":[{\"createTime\":\"2014-06-21 22:25:00\",\"file_id\":6305925,\"file_length\":4,\"file_name\":\"test.txt\",\"file_type\":0},{\"createTime\":\"2014-06-21 22:24:57\",\"file_id\":6308764,\"file_length\":70,\"file_name\":\"Makefile\",\"file_type\":0},{\"createTime\":\"2014-06-21 22:24:52\",\"file_id\":6301961,\"file_length\":104,\"file_name\":\""; //要求写一段代码把最后一个file_id的值(这里的6301961)找到并打印出来。 #include <stdio.h> #include <string.h> char s[]="{\"jd_clouds_sm_jb_file_list_responce\":{\"code\":\"0\",\"receive_result\":{\"code\":\"200\",\"data\":\"{\"files\":[{\"createTime\":\"2014-06-21 22:25:00\",\"file_id\":6305925,\"file_length\":4,\"file_name\":\"test.txt\",\"file_type\":0},{\"createTime\":\"2014-06-21 22:24:57\",\"file_id\":6308764,\"file_length\":70,\"file_name\":\"Makefile\",\"file_type\":0},{\"createTime\":\"2014-06-21 22:24:52\",\"file_id\":6301961,\"file_length\":104,\"file_name\":\""; char *p,*q; int id; int main() {     p=strstr(s,"\"file_id\":");     if (NULL==p) return 1;     while (1) {         p+=strlen("\"file_id\":");         q=strstr(p,"\"file_id\":");         if (NULL==q) {             if (1==sscanf(p,"%d",&id)) {                 printf("The last file_id is %d\n",id);             } else return 2;             break;         } else {             p=q;         }     }     return 0; } //The last file_id is 6301961 //

user: user-2
content: 你用的什么编译器？while 循环不会崩溃的，你再把puts注释掉试试，看看while有没有问题。

user: user-0
content: 楼上的 我把下面的sscanf语句去掉还是会崩溃，可以确定是while循环执行导致的

user: user-2
content: 程序崩溃不是因为while循环，是因为这句sscanf(pTmp2,":%[^,]",tmp); 你的pTmp2从循环跳出之后必要是NULL，不然跳不出来，所以你的puts输出也是空的。 sscanf 因为pTmp2是空，必然崩溃。

user: user-3
content: 建议你调试一下，看看相关变量的值的情况 另外，简化一下字符串，分析一下。。。

user: user-0
content: 回楼上的 pTmp2+= strlen(key); 循环不会永远进行下去

user: user-4
content: 你 while 的终止条件就是 pTmp2 == NULL， while 结束后 pTmp2 必然就是 NULL， 对 NULL 操作就产生未定义行为
user-0 提问: c static

回复:
user: user-1
content: 假设编译器从右向左计算参数，在计算get_c(1)时，返回指向static buf的指针（此时buf的内容是Monday），接着计算get_c(0)，同样返回指向static buf的指针（但此时buf的内容已经变为Sunday了）。所以在执行printf函数体时，两个参数都是指向静态buf的指针，并且buf的内容现在是Sunday。

user: user-2
content: 你看看函数的执行顺序：  get_c(1) get_c(0) printf  和   get_c(1) printf get_c(0) printf  的区别

user: user-0
content: @     u013797412      user-3   printf("%s\n, get_c(0)); printf("%s\n", get_c(1)); 与 printf("%s\t%s\n", get_(0), get_a(1)); 结果为什么不一样，谢谢

user: user-3
content: 拆成两句你就知道 神马问题了（ 前提你把指针搞明白了，还有参数进栈的顺序问题） printf("%s\n, get_c(0)); printf("%s\n", get_c(1));

user: user-0
content: 为什么static修饰的buf值不会变？ 如果在main中定义static的buf，它的值为什么又可以变， 比如  在main中 static char buf[20]="abcd";     这个值可以变啊

user: user-2
content: 函数调用时要先把所有参数都求值的，在 printf 函数的里面，两个字符串都指向的同一个内存，而且在 printf 这个函数执行的过程中，这个值是不会变化的。
user-0 提问: 实在 想不到啊！！  快疯了！！啊啊啊啊啊

回复:
user: user-0
content: 引用 1 楼 brookmill 的回复:整个程序最后，36行多了个}，整行删掉就能编译了 引用 2 楼 brookmill 的回复:gcd里面return a放错地方了，要拿到while循环外面来 引用 2 楼 brookmill 的回复:gcd里面return a放错地方了，要拿到while循环外面来 引用 3 楼 brookmill 的回复:还有，定义函数怎么都没有返回值呢？  int main(void) { ...} int gcd (int a, int b) { ... } 引用 5 楼 u012421456 的回复:还有，要学会看编译器的报错提示，这是我的编译器报错 error: syntax error before '}' token 它都说了 } 的错误，你就该找找看{}有没有匹配啊，可以换个好一点的编译器，看你的报错提示，是用VC6吗 引用 6 楼 brookmill 的回复:最小公倍数应该是lcm 做除法的时候要先判断除数是否0，比如 d = a * b/c 这里面的c 引用 8 楼 u012421456 的回复:[quote=引用 7 楼 zxhuser-3 的回复:] [quote=引用 4 楼 u012421456 的回复:] 楼上说的都对，改过以后就可以运行了 我补充的是规范问题 int gcd(int a, int b); int gbs(int a, int b, int c);  int main (void) { 	int m, n, x, y; 	printf ("请输入两个数m和n："); 	scanf ("%d %d", &m, &n); 函数声明最好放外边，而且不要两个函数放一块声明，说实话，这种方式还是第一次见，不要再用main了，最好像上面那样，最后，你scanf中两个%d中间是一个逗号加一个空格，这两个在这儿都属于非输入控制符，必须原样输出，最好不要这么写，可以只在scanf的%d中间加一个空格即可 加不加空格其实没关系。。。[/quote]的确，不影响输入，但最好加上[/quote] 】   总的来说！谢谢了！  我想了一天啊！！ 总算解决了！  但只有40分  如果分的不好！大家不要介意！ 谢谢  大家！

user: user-1
content: 引用 7 楼 zxhuser-3 的回复:[quote=引用 4 楼 u012421456 的回复:] 楼上说的都对，改过以后就可以运行了 我补充的是规范问题 int gcd(int a, int b); int gbs(int a, int b, int c);  int main (void) { 	int m, n, x, y; 	printf ("请输入两个数m和n："); 	scanf ("%d %d", &m, &n); 函数声明最好放外边，而且不要两个函数放一块声明，说实话，这种方式还是第一次见，不要再用main了，最好像上面那样，最后，你scanf中两个%d中间是一个逗号加一个空格，这两个在这儿都属于非输入控制符，必须原样输出，最好不要这么写，可以只在scanf的%d中间加一个空格即可 加不加空格其实没关系。。。[/quote]的确，不影响输入，但最好加上

user: user-2
content: 最小公倍数应该是lcm 做除法的时候要先判断除数是否0，比如 d = a * b/c 这里面的c

user: user-1
content: 还有，要学会看编译器的报错提示，这是我的编译器报错 error: syntax error before '}' token 它都说了 } 的错误，你就该找找看{}有没有匹配啊，可以换个好一点的编译器，看你的报错提示，是用VC6吗

user: user-1
content: 楼上说的都对，改过以后就可以运行了 我补充的是规范问题 int gcd(int a, int b); int gbs(int a, int b, int c);  int main (void) { 	int m, n, x, y; 	printf ("请输入两个数m和n："); 	scanf ("%d %d", &m, &n); 函数声明最好放外边，而且不要两个函数放一块声明，说实话，这种方式还是第一次见，不要再用main了，最好像上面那样，最后，你scanf中两个%d中间是一个逗号加一个空格，这两个在这儿都属于非输入控制符，必须原样输出，最好不要这么写，可以只在scanf的%d中间加一个空格即可

user: user-3
content: 引用 4 楼 u012421456 的回复:楼上说的都对，改过以后就可以运行了 我补充的是规范问题 int gcd(int a, int b); int gbs(int a, int b, int c);  int main (void) { 	int m, n, x, y; 	printf ("请输入两个数m和n："); 	scanf ("%d %d", &m, &n); 函数声明最好放外边，而且不要两个函数放一块声明，说实话，这种方式还是第一次见，不要再用main了，最好像上面那样，最后，你scanf中两个%d中间是一个逗号加一个空格，这两个在这儿都属于非输入控制符，必须原样输出，最好不要这么写，可以只在scanf的%d中间加一个空格即可 加不加空格其实没关系。。。

user: user-2
content: 还有，定义函数怎么都没有返回值呢？  int main(void) { ...} int gcd (int a, int b) { ... }

user: user-2
content: gcd里面return a放错地方了，要拿到while循环外面来

user: user-2
content: 整个程序最后，36行多了个}，整行删掉就能编译了
user-0 提问: 为什么C语言程序中，地址只有0X00000000到0XFFFFFFFF

回复:
user: user-0
content: 引用 7 楼 zhang5476499 的回复:随便说下：cpu能直接操作的，只有内存，不能直接使用硬盘的数据，但是文件都是存储在硬盘中的，那么内存总是先把硬盘数据调到内存，然后才能操作！ 谢谢了

user: user-1
content: 4G说的是内存，上百个G那是硬盘。 c程序不会通过一个地址去访问硬盘，程序里面的地址说的都是内存。 4G说的是32位地址总线的情况，x86在某些情况下可以支持到36位(细节不记得了)

user: user-2
content: 程序只有加载到内存中然后才可以执行，32位地址总线可以寻址4G内存 而硬盘则用于存储数据的

user: user-3
content: 内存和硬盘不要搞混了。。。

user: user-4
content: 楼主把硬盘和内存搞混了，4G是32为地址总线的情况，2的32次方个bit等于4G， http://zhidao.baidu.com/link?url=hQEX7gyMkRyNx6RxjDJYZ-zbUgFBQIW4bVceWazDyab79pJicY7muVZhTexSDe2ty04tVEw2ZdgQGp4ufSLxvq

user: user-5
content: 随便说下：cpu能直接操作的，只有内存，不能直接使用硬盘的数据，但是文件都是存储在硬盘中的，那么内存总是先把硬盘数据调到内存，然后才能操作！

user: user-5
content: 因为这是4G内存的地址范围。 0x0000 0000 -- 0x FFFF FFFF就等于4G！

user: user-6
content: 不问是不是 就问为什么 这是耍流氓  根本没有所谓的 只有 0~FFFFFFFF wintc是 0~FFFF gcc某些版本可以0~FFFFFFFFFFFFFFFF
user-0 提问: 两块内存 有没有可能 为不同数据类型时，比较时大小不一样？

回复:
user: user-1
content: 已知A整体>B整体， 并不能得出 A局部>B局部

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-3
content: 引用 7 楼 u012526168 的回复:[quote=引用 4 楼 poemdreamer 的回复:] 哪有两块内存去比较大小的，  只有相同类型直接比较大小， 或写一个函数 比较两个类型大小 ，  你用 int 转成char 比较 就涉及越界     char 转成 int 就可以 我给你举个例子啊： 比如我现在正在写的数据库,支持三种数据类型，以查询选修了四号课程的学生姓名 及其成绩（no,name,score 分别是int，char（10），和float型的） select s.sname,sc.score from s,c,sc where s.sno = sc.sno and c.cno = sc.cno and c.no = 4 在进行条件判断时候，我要从三个数据表中分别读取记录项，之后对条件进行逐一判断，首先要获取属性对应的信息， 当然如果能获得属性的类型和属性的长度，去内存中分别去的该属性的对应长度的内存，转化成该属性对应的类型，进行比较当然可以，我就是想问是否可以不用管他的类型，直接比较对应属性的长度的内存区，来判断条件是否成立，这样的话，就不用分别比较了，减少了点操作。[/quote]  不行，你说的不管类型，估计就是都按字符串比较

user: user-0
content: 引用 4 楼 poemdreamer 的回复:哪有两块内存去比较大小的，  只有相同类型直接比较大小， 或写一个函数 比较两个类型大小 ，  你用 int 转成char 比较 就涉及越界     char 转成 int 就可以 我给你举个例子啊： 比如我现在正在写的数据库,支持三种数据类型，以查询选修了四号课程的学生姓名 及其成绩（no,name,score 分别是int，char（10），和float型的） select s.sname,sc.score from s,c,sc where s.sno = sc.sno and c.cno = sc.cno and c.no = 4 在进行条件判断时候，我要从三个数据表中分别读取记录项，之后对条件进行逐一判断，首先要获取属性对应的信息， 当然如果能获得属性的类型和属性的长度，去内存中分别去的该属性的对应长度的内存，转化成该属性对应的类型，进行比较当然可以，我就是想问是否可以不用管他的类型，直接比较对应属性的长度的内存区，来判断条件是否成立，这样的话，就不用分别比较了，减少了点操作。

user: user-4
content: 引用 2 楼 u012526168 的回复:[quote=引用 1 楼 user-8 的回复:] 我规定1>1 那么1就大于1 ？？？？哥，能详细点吗？[/quote]你问题不完全 还怎么指望别人回答详细

user: user-5
content: 引用 1 楼 user-8 的回复:我规定1>1 那么1就大于1 这话怎么像是赵老师说的。

user: user-6
content: 哪有两块内存去比较大小的，  只有相同类型直接比较大小， 或写一个函数 比较两个类型大小 ，  你用 int 转成char 比较 就涉及越界     char 转成 int 就可以

user: user-7
content: 可以，int有符号，char无符号 如果a的首位是1，b的首位是0，那么int的时候b>a，char的时候a>b

user: user-0
content: 引用 1 楼 user-8 的回复:我规定1>1 那么1就大于1 ？？？？哥，能详细点吗？

user: user-8
content: 我规定1>1 那么1就大于1
user-0 提问: 关于别名  c++

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  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: A &r = func(); 对于支持c++11 右值引用的编译器是没问题的吧。

user: user-0
content: 我用vs2010编译没问题，codeblocks就编译不通过

user: user-3
content: 临时对象是右值，你这个是左值引用。

user: user-4
content: vs2010测试无错呢 func返回的是一个对象的话，应该是返回了该对象的一个临时的拷贝，不知道楼主的具体错误是什么

user: user-5
content: A func() {     cout<<"跳转到func函数中……\n";     A a(333);     cout<<&a<<endl;     return a; }   注意看这个函数，你的return a把对象返回出去，外面的A& r就成为这个a对象的别名，但是紧接着，func()函数结束，局部对象释放，包括你这个a对象也灰飞烟灭了。  这种情况想要把a对象正确地返回出来，外面不应该用别名去接收，也不能用指针，要用一个A对象去接收，比如A r=func();

user: user-6
content: func返回的是局部对象
user-0 提问: 求助   win8上的vc++6.0

回复:
user: user-1
content: 使用codeblocks ，这个挺好。VC6在旧了。

user: user-2
content: 同意楼上，，换一个吧

user: user-3
content: 编程不是学考古。你就用个新点的编译器吧。
user-0 提问: 用链表模拟栈机制倒序输出字符串

回复:
user: user-0
content: // exercise 5, chapter 17   #include <stdio.h> #include <stdlib.h>   typedef char Item;   typedef struct node {     Item item;     struct node * next;     struct node * prev; }Node;   typedef struct {     Node * head;     Node * tail; }Stack;   int main(void) {     char ch;     Stack stack;     Node * tmp;       stack.head = stack.tail = NULL;     puts("Enter a string:");     while((ch = getchar())!= '\n' && (ch = getchar()) != EOF)   //我找到了，是这里出了问题     {                                                                           //(ch = getchar()) != EOF是多读了字符了         tmp = (Node *) malloc(sizeof(Node));         tmp->item = ch;         if(tmp == NULL)         {             fputs("Failed to allocate memory.", stderr);             exit(1);         }         if(stack.head == NULL)         {             stack.head = tmp;             stack.head->prev = NULL;  //让第一个元素的前溯指针为NULL         }         else         {             stack.tail->next = tmp;                 tmp->prev = stack.tail; //让从第二个元素开始的前溯指针指向前一个元素                    }         tmp->next = NULL;         stack.tail = tmp;     }     if(stack.head == NULL)         puts("No string entered.");     else     {         puts("String in reverse:");         tmp = stack.tail;         while(tmp != NULL)         {             putchar(tmp->item);             tmp = tmp->prev;         }     }       puts("\nDone!");     return 0; }

user: user-1
content: 直接倒序创建链表不就行了吗，要弄这么复杂吗？ 倒序创建链表（仅供参考） typedef struct node { 	int num; 	struct node *next; }NODE; struct node *crfun(int n) { 	NODE* head=NULL; 	NODE* p; 	while(n) 	{ 		p=(NODE*)malloc(sizeof(NODE)); 		scanf("%d",&p->num); 		p->next=head; 		head=p; 		n--; 	} 	return p; }
user-0 提问: 数据类型和printf（）格式说明符

回复:
user: user-0
content: 是啊，在code blocks里使用%e %le 得到的结果总是相差很大，是什么原因？  怎么解决啊

user: user-1
content: vc下正常 num=290000.000000 num=2.900000e+005 Press any key to continue 你用的是CodeBlocks，建立工程的时候是选择32位的吗