Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 计算字符串长度？

回复:
user: user-1
content: size_t strlen(const char *s) {         const char *sc;           for (sc = s; *sc != '\0'; ++sc)                /* nothing */;        return sc - s;  }

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

user: user-3
content: 这么简单的问题，单步跟一下就啥都知道了，不会调试程序不是一个合格的程序员

user: user-4
content: 你让p指向一个毫无关系的字符串常量"a",最后再让s的末尾位置减这个p，怎么能对呢？让p先指向s，保存住首地址才对

user: user-5
content: <c程序设计语言>上是这么写的 int strlen(char *s) {   char *p = s;   while(*p != '\0')   p++;    return p - s; }

user: user-6
content: while(*s++)  ; 改成 for( ;*s;++s); 或者s-p-1

user: user-7
content: 计算字符串长度也可以这样：  int strlen( const char *str ) //输入参数const { 	assert( str != NULL ); //断言字符串地址非0 	int len; 	while( (*str++) != '\0' )  	{  		len++;  	}  	return len; }

user: user-7
content: 可以改成这样： #include <stdio.h> size_t my_strlen(const char *s) { 	const char *p=s; 	while(*s!='\0') 	{ 		s++; 	} 	return s-p; }  int main() { 	const char *q="a"; 	printf("%d\n",my_strlen(q)); }

user: user-8
content: while(*s++) 执行完后s的值已指导'\0'

user: user-0
content: 更改：  size_t my_strlen(const char *s)   {     const char *p=s;     while(*s++)        ;     return s-p;   }  int main()   {     const char *q="a";     printf("%d\n",my_strlen(q));  //输出是：2。是错！   }  问题： 1.函数是计算字符串长度。 函数是用字符串最后字符的下一个字符，也就是空字符('\0')的地址，减去字符串的首地址。 其结果，就是字符串长度。 为什么，函数是错呢？
user-0 提问: 新人求大神来看看

回复:
user: user-1
content: 这是我前段时间在网上找的程序，对LZ有用，仅供参考： /*     2、将一句话里的单词进行倒置，标点符号不倒置。 	比如一句话：i come from beijing.倒置后变成：beijing. from come i。      	解析：解决该问题可以分为两步： 	第一步全盘置换该语句成：.gnijieb morf emoc i。 	第二步进行部分翻转，如果不是空格，则开始翻转单词。*/ #include <iostream> using namespace std; void main ()  {       	int  i=0, j=0, begin, end; 	char str[] = "hello world"; 	char temp; 	j = strlen(str) - 1; 	//第一步是进行全盘翻转 	while(j>i) 	{ 		temp = str[i]; 		str[i++] = str[j]; 		str[j--]=temp; 	} 	cout<<"第一步全盘翻转："<<str<<endl;//.gnijieb morf emoc i  	//第二步进行部分翻转 	i=0; 	while(str[i])  	{ 		if(str[i] != ' ') 		{   			begin = i; 			while(str[i] && str[i] != ' ') 				i++;                 //找到str[i]为空格符  			i = i - 1;               //空格符回退一个    			end = i;          		}           		while(end > begin) //部分翻转          		{               			temp = str[begin]; 			str[begin++] = str[end]; 			str[end--] = temp; 		}          		i++; 		//cout<<str[i]<<endl; 	}       	cout << "第二步进行部分翻转：" << str << endl;  }

user: user-2
content: 你自己先写。哪里不会再来提问
user-0 提问: 急用一份学生管理系统c语言程序

回复:
user: user-1
content: 楼主说的一堆里,其实除了界面制作的时候比较蛋疼,在没什么难度

user: user-2
content: 引用 1 楼 user-4 的回复:还不如给你同学些钱，让他帮你做。

user: user-3
content: http://yunpan.cn/cfGsTtizjekvI  提取码 4a32 挺不错的 ，可以借鉴一下

user: user-4
content: 还不如给你同学些钱，让他帮你做。
user-0 提问: 将手动输入数据改为在程序中已经写好数据！问题比较急~

回复:
user: user-1
content: 将scanf改为直接初始化。 比如 sampleNode z[2]={ {{1.,2.,3.,4.,5.,6.,7.,8.,9.,10.},1},//z[0] {{1.,2.,3.,4.,5.,6.,7.,8.,9.,10.},2},//z[1] };
user-0 提问: AOE网关键路径算法问题，c语言

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:这里肯定是指针方面除了问题。  要快速掌握数据结构不现实，只有踏实多做总结、多思考以及多看看其他经典的源码我也大概知道应该指针出错，继续努力中

user: user-1
content: 这里肯定是指针方面除了问题。  要快速掌握数据结构不现实，只有踏实多做总结、多思考以及多看看其他经典的源码
user-0 提问: 帮忙看下贪心算法的题目，为何wa了，测试结果好像挺对的

回复:
user: user-1
content: 引用 3 楼 whm546877424 的回复:为何呢？？ 不太明白你的意思。不就是让你解决问题么？而且也只是个人建议，你可以不用采纳。

user: user-0
content: 引用 2 楼 panasonic0804 的回复:个人觉得你应该定义一个struct，该结构中可包含一个link来记录以该点为起点，有效项任务(或者是总数)。然后，你只需要访问这个link或者是总数就可以了吧。为何呢？？

user: user-1
content: 个人觉得你应该定义一个struct，该结构中可包含一个link来记录以该点为起点，有效项任务(或者是总数)。然后，你只需要访问这个link或者是总数就可以了吧。

user: user-2
content: 通向金牌之路 《全国青少年信息学竞赛培训教材——复赛》陈合力 游光辉 编著 浙江大学出版社 定价：39.00元（含光盘）
user-0 提问: 算不出平均分求助【c语言】

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

user: user-0
content: 引用 1 楼 xionggch 的回复:a是学生数？b是每个学生的科目数？  double Aver( Student stu[], int a, int b ) {     int i, j;     double n=0;     for( i=0; i<a; i++ )     {         for( j=0; j<b; j++ )         {             printf( "%f", stu[i].score[j] );             n += stu[i].score[j];         }         printf( "\n" );     }     printf( "%f", n );     printf( "%f", n/(i*j) );     return n/(i*j); }  我直接把你的代码换掉我的，然后结果就变成下图这样了

user: user-2
content: a是学生数？b是每个学生的科目数？  double Aver( Student stu[], int a, int b ) {     int i, j;     double n=0;     for( i=0; i<a; i++ )     {         for( j=0; j<b; j++ )         {             printf( "%f", stu[i].score[j] );             n += stu[i].score[j];         }         printf( "\n" );     }     printf( "%f", n );     printf( "%f", n/(i*j) );     return n/(i*j); }

user: user-3
content: 你先scanf("%d",&a)然后才n=n/a，只有在输入的值与原值一样时才正确。 此外，图二的结果我没看出哪点儿不正确： ( 59 + 70 + 64 + 64 ) / 4 = 64.25 ≈ 64 ( 69 + 80 + 74 + 74 ) / 4 = 74.25 ≈ 74 让我惊奇的是你居然能用printf("%d",n)输出double类型，难道你的程序前面有#define double int？
user-0 提问: epoll_wait

回复:
user: user-0
content: 引用 5 楼 wanguser-3 的回复:[quote=引用 3 楼 fdsafwagdagadg6576 的回复:] 第4个参数是timeout，为0则epoll_wait立即返回，不阻塞，CPU当然高了。-1则阻塞等到相应事件的发生才返回。 你看你添加的fd可读可写了没有。[/quote]  fd可读写是什么意思？ 我只用了ecp_ctrl(epfd,EPOLL_CTL_ADD,fd,*ev)。 没有用EPOLL_CTL_MOD 同一个socket应该即可以读又可以写啊。 select，poll也不需要切换fd状态，同一个socket既可以读也可以写啊？[/quote] 还有你添加的ev是什么事件，如果是EPOLLIN，那这个fd如果没有数据到达那epoll_wait就一直阻塞啊[/quote]  ev,events 没有问题是epollin|epollout

user: user-1
content: 搜“select、poll、epoll之间的区别总结”

user: user-2
content: 问题是什么？  第4个参数是超时，0，当然只是尝试一下，线程不阻塞，当然CPU100% （不断尝试中。。。。）

user: user-3
content: 引用 楼主 fdsafwagdagadg6576 的回复:用epoll做服务器。阻塞在epoll_wait. 通过gdb，问题是epoll_wait_nocancel。 	nfds=epoll_wait(epfd,events,1024,-1); 参数4开始是0，cpu达到100%，后来改成-1，cpu正常. 但是epoll_wait_nocancel。 第4个参数是timeout，为0则epoll_wait立即返回，不阻塞，CPU当然高了。-1则阻塞等到相应事件的发生才返回。 你看你添加的fd可读可写了没有。

user: user-3
content: 引用 3 楼 fdsafwagdagadg6576 的回复: 第4个参数是timeout，为0则epoll_wait立即返回，不阻塞，CPU当然高了。-1则阻塞等到相应事件的发生才返回。 你看你添加的fd可读可写了没有。[/quote]  fd可读写是什么意思？ 我只用了ecp_ctrl(epfd,EPOLL_CTL_ADD,fd,*ev)。 没有用EPOLL_CTL_MOD 同一个socket应该即可以读又可以写啊。 select，poll也不需要切换fd状态，同一个socket既可以读也可以写啊？[/quote] 还有你添加的ev是什么事件，如果是EPOLLIN，那这个fd如果没有数据到达那epoll_wait就一直阻塞啊

user: user-0
content: 引用 2 楼 sinservice 的回复:问题是什么？  第4个参数是超时，0，当然只是尝试一下，线程不阻塞，当然CPU100% （不断尝试中。。。。）  问题是block 在ecp_wait 不动

user: user-0
content: [/quote] 第4个参数是timeout，为0则epoll_wait立即返回，不阻塞，CPU当然高了。-1则阻塞等到相应事件的发生才返回。 你看你添加的fd可读可写了没有。[/quote]  fd可读写是什么意思？ 我只用了ecp_ctrl(epfd,EPOLL_CTL_ADD,fd,*ev)。 没有用EPOLL_CTL_MOD 同一个socket应该即可以读又可以写啊。 select，poll也不需要切换fd状态，同一个socket既可以读也可以写啊？
user-0 提问: 数组名完全等价于首元素地址？

回复:
user: user-1
content: 请参考K&R 《C程序设计语言》第二版附录A.7.1  A.7.1  指针生成      对于某类型T，如果某表达式或子表达式的类型为“T类型的数组”，则此表达式的值是指向数组中第一个对象的指针，并且此表达式的类型将被转换为“指向T类型的指针”。如果此表达式是一元运算符&或sizeof，则不会进行转换。

user: user-2
content: 这是因为，函数调用是表达式 函数调用的实参也是表达式  数组名，在解析表达式的时候，a,*a 这些表达式中，解析为指针

user: user-3
content: 当然不会 只是有时候数组名会隐式转换为指向数组第一个元素的指针[非左值]

user: user-4
content: 慢慢的体会吧

user: user-5
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-6
content: 《C和指针》

user: user-7
content: 三楼已经让你清楚了吧

user: user-5
content: 说是一物即不中。搜“盲人摸太阳”。

user: user-8
content: 既然楼主都发现两者的sizeof不一样了  肯定“数组名和元素首地址完全等价”这句话就不对了～～  当我们想把数组做实参的时候，通常会把形参设定为指针  但其实呢，这里涉及到一个隐形的“降阶”过程，即从数组类型降为指针 为什么说是降而不是升呢？ 因为数组类型包含两个信息：地址和长度 而指针只包含地址，少了长度 所以在传递参数的时候，实际上是丢掉了长度信息  对于编译器而言，任何数据的类型，都是把该数据挖去后剩下的东西即为它的类型  比如，int i  i的类型为int int *p  p的类型为int * 那么，int a[3] a的类型是什么呢？是 int [3]类型 int b[4] b的类型就是 int [4]类型 int[3]和int[4]是两种完全不同的、毫不相关的类型 用人类的语言可以说他们都是int型数组  但在编译器看来 这就是两种完全不同的类型  所以 指针的类型是指针 数组的类型是数组  它们是不相关的 只不过，你可以用数组名初始化一个指针  但这并不意味着他俩就是一回事 最直接的证据就是sizeof

user: user-6
content: 用多了，就懂了。  也就不再执着于“完全等价”的问题了。

user: user-9
content: 第一个是整个数组 第二个是个地址

user: user-10
content: 去认真啃《C和指针》
user-0 提问: 【求助】关于C语言编写登陆器

回复:
user: user-1
content: 引用 1 楼 jiezai69 的回复:就没人会吗？ 这东西，就算是程序，也没人会免费给你的。更别说源代码了。

user: user-2
content: C++、CHttpConnection、CHttpFile、ASP、存储过程、T-SQL、SQL Server

user: user-0
content: 就没人会吗？
user-0 提问: 链表文件写入和输出  急急急~~~

回复:
user: user-1
content: fwrite(list,sizeof(list),1,fp); fread(list,sizeof(list),1,fp); 写入和读出的数据块应该是struct lnode_t，不是list

user: user-2
content: fread配合fwrite更好用

user: user-3
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 没有报错， 能写入关闭再打开后不能读取！

user: user-4
content: 报错信息是什么?
user-0 提问: C语言与链表

回复:
user: user-1
content: 楼主这个系统不打算用数据库? 这些信息必然是全部存数据库的，不然你的程序一重启所有东西全都没了

user: user-2
content: 和链表基本没关系。 楼主学习使用SQL Server和ADO正当时。

user: user-3
content: 百度+Google，很多关于C链表的
user-0 提问: 求助 复制C primer plus书上的程序后 运行显示未定义的符号     '_sum_squares' 

回复:
user: user-0
content: 找到了，double sum_suqares (int a, int b)，应该是sum_squaers

user: user-0
content: 引用 1 楼 user-1 的回复:加个#include<stdlib.h>试试 加了，还是一样的错误。

user: user-1
content: 加个#include<stdlib.h>试试
user-0 提问: 关于字符串的一道题，求改错

回复:
user: user-1
content: 用C的标准库，专门有字符串处理的函数，多了去了

user: user-0
content: 我没有学过C++，各位大神能用C做么

user: user-0
content: 这是我们学校的在线测试，这是题目，可是我通过不了，不知道是什么测试数据错了，还是我题目那里理解的有问题？

user: user-2
content: for reference only /*************************************************************************     > File Name: test3.cpp     > Author: jukay     > Mail: hellojukay@163.com      > Created Time: 2014年12月18日 星期四 18时58分44秒  ************************************************************************/  #include<iostream> #include<algorithm> #include<vector> #include<string> using namespace std;   int main() { 	string str,tmp; 	vector<string> v; 	cin >> str ; 	while(cin >> tmp) 	{ 		if(tmp == "\n") 			break; 		v.push_back(tmp); 	} 	int n = count(v.begin(), v.end(), str); 	cout << n << endl;  	return 0; }

user: user-3
content: 哪里错了？不明白楼主想要大家干什么。。。
user-0 提问: 关于STDIN_FILENO和STDOUT_FILENO的问题

回复:
user: user-1
content: 引用 2 楼 u011021711 的回复:引用 1 楼 q3733353520 的回复:可以这么理解 read阻塞时，在键盘上输入字符会显示到控制台，那这些字符是存在哪儿的呢？跟STDIN_FILENO和STDOUT_FILENO有什么联系没？  我的理解是read是行缓冲，   这些内容应该放在缓冲区  跟  0  和 1 肯定是有关系的 。

user: user-0
content: 引用 1 楼 q3733353520 的回复:可以这么理解 read阻塞时，在键盘上输入字符会显示到控制台，那这些字符是存在哪儿的呢？跟STDIN_FILENO和STDOUT_FILENO有什么联系没？

user: user-1
content: 可以这么理解
user-0 提问: 请问各位大神，c语言二维数组的动态分配应该怎么写？

回复:
user: user-1
content: #define ROW    3 #define COL     3 int main(void) {     int i;     int **array = (int **)malloc(sizeof(int *) * ROW);     for (i = 0; i < ROW; i++)         array[i] = (int *)malloc(sizeof(int) * COL); }

user: user-2
content: http://blog.csdn.net/judy_c/article/details/62038688 可以看一下这个。还是比较系统的

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-4
content: for reference only,code for c99 only; #include <stdio.h>  int main(void) { 	// your code goes here 	int n,m; 	scanf("%d%d",&n,&m); 	int a[m][n]; 	return 0; }

user: user-5
content: 参考 http://blog.chinaunix.net/uid-20698826-id-3085718.html

user: user-6
content: http://bbs.csdn.net/topics/390952047  看这个帖子

user: user-5
content: 参考 http://blog.sina.com.cn/s/blog_5fd837410100n0fh.html
user-0 提问: 急！！45度角：float a = tan(45.0f) 为什么不等于1而是等于1.6197

回复:
user: user-1
content: 改为 tan(PI/4)  引用 楼主 z__j__s 的回复:45度角： float a = tan(45.0f) 为什么不等于1而是等于1.6197，４５度角tan应该等于１啊 46度角： float b = tan(46.0f);为什么是等于 -2.086, 第一限象的角tan怎么会有负数

user: user-2
content: tan, tanh Calculate the tangent (tan) or hyperbolic tangent (tanh).  double tan( double x );  double tanh( double x );   Parameter  x  Angle in radians  角度要弧度

user: user-3
content: 单位是弧度.
user-0 提问: C语言 帮慢看看这题关于加减问题的

回复:
user: user-1
content: for reference only #include<stdlib.h> #include<string.h> #include<stdio.h> int main() { 	char buffer[100]; 	char ch; 	int num[11]; 	char symbol[10]; 	int result ; 	int n = 0;//运算次数 	memset(num,0,sizeof(num)); 	scanf("%s",buffer);  	for(int i = 0; i < strlen(buffer); ++i) 	{ 		ch = buffer[i]; 		if(ch <= '9' && ch >= '0') 		{ 			 num[n] = 10 * num[n] + ch - '0'; 		} 		else if(ch == '+' || ch == '-') 		{ 			//保存运算符 			symbol[n++] = ch; 		} 		else if(ch == ' ') 			continue; 		else 		{ 			fprintf(stderr,"表达式包含非法符号\n"); 			exit(EXIT_FAILURE); 		} 	}  	result = num[0]; 	for(int j = 0 ; j < n;) 	{ 		switch(symbol[j++]) 		{ 			case '+':result = result + num[j]; 					 break; 			case '-':result = result - num[j]; 					 break; 			default: fprintf(stdout,"error\n"); 				    break; 		} 	}  	printf("%d\n",result);  	exit(EXIT_SUCCESS); }

user: user-2
content: 你可以定义一个固定大小的buff[MAX]，然后整体读入scanf/fgets. 再你对buff里的内容进行指定的分析(数字还是符号)。  示例：  #define MAX 100 int a[MAX]; scanf("%s",a); anyle(a); ......  input:123+456-789

user: user-0
content: 引用 1 楼 user-2 的回复:scanf("%d%c%d",....) 你不需要加空格吧我输入的是字符串，例如：char a[]='123' 然后用atoi函数转换，atoi是把字符串转换成长整型数的一种函数

user: user-2
content: scanf("%d%c%d",....) 你不需要加空格吧
user-0 提问: 《C程序设计语言》第六章6.6表查找例子中np->next = hashtab[hashval]; hashtab[hashval]=np;这句怎么解释

回复:
user: user-1
content: np->next=hashtab[hashval]; //链表是从后面往前连接，当你新建一个nlist *(name,defn)到链表中，这条语句把新建的nlist *(name,defn)的next指向链表的前面。 hashtab[hashval]=np;            //把hashtab[hashval]指向新建的nlist *(name,defn)。 free((void *)np->defn);            //只是由于当执行if( (np=lookup(name) )==NULL)语句后，指针指向的是链表中的defn,而不是新建nlist*(name,defn)中defn,所以要把它free.

user: user-2
content: 能静下心来仔细分析代码是第一步。先好好分析吧

user: user-3
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495
user-0 提问: 寻求一些建议，关于异步编程

回复:
user: user-0
content: 只好不满意结贴么？

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:建议楼主先确认你的代码的性能和IOCP或epoll在一个数量级上再说。  IO本质上还是用iocp或epoll，只是原来是       线程 回调 业务函数  现在是：     把业务函数做成“协程”，或者叫 fiber一类的。这样可以让业务流程更符合人类的直觉。  fiber这类东西都是用户态的，根本无需切换到内核上下文，所以，性能不是问题。

user: user-1
content: 建议楼主先确认你的代码的性能和IOCP或epoll在一个数量级上再说。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:屌丝们在纠结异步的时候，Windows已经进化到IOCP了。  楼主搜"epoll"  epoll和iocp只是我这个玩意儿的部分的底层实现。  你可能还没看好问题捏。  我实现了一个类似c#的async/await机制，  比如， 一般iocp是这样的编程机制：     在线程A：      obj->callback = sent_callback;      WSASend（ 。。。。 ）      在线程B：      GetQueued。。（。&obj。）      obj->callback ( obj .... )            都是回调处理，obj是一个自动机，维护一个跟“业务相关”的状态值。  现在我的编程模型是：       op = async_send( ....  )；     。。。。。      async_wait ( op )；   这看起来像同步，没错，就是要这种效果： 异步问题，同步化处理。       但在  async_wait 的时候，当前线程被回收了，当等到op时，线程又恢复了。  也就是说，这种模型的写法跟同步一样，但外部规格却是异步的，处理N多业务，只是使用固定的线程数量。

user: user-1
content: 屌丝们在纠结异步的时候，Windows已经进化到IOCP了。  楼主搜"epoll"
user-0 提问: va_start看晕了，求高手指点

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

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: 引用 1 楼 sinservice 的回复:#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )   ap是指 va_list 变量 v 是指 ...之前的那个形参，如：    int print( char const *fmt, ...  )  {       va_list  va;       va_start(va, fmt);                 .....  va_arg(va, .......)  .....        va_end(va);  }    va_list是个字符型指针吧？

user: user-2
content: #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )   ap是指 va_list 变量 v 是指 ...之前的那个形参，如：    int print( char const *fmt, ...  )  {       va_list  va;       va_start(va, fmt);                 .....  va_arg(va, .......)  .....        va_end(va);  }

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

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！ 膜拜赵老师，问题找到了，不是什么函数只不过是个宏而已，我想复杂了
user-0 提问: 将数组中的n个整数按相反顺序存放.

回复:
user: user-1
content: for(i=0;i<(n-1)/2;i++)  "i<"漏掉了，楼主要细心啊

user: user-2
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-3
content: void swap(int a[],int n) { int i,j,temp; for(i=0;i<(n-1)/2;i++)//这漏了i< { j=n-1-i; temp=a[i];a[i]=a[j];a[j]=temp; } }

user: user-4
content: for(i=0;(n-1)/2;i++) ===> for (i = 0; i < (n - 1) / 2; i++)
user-0 提问: 看一看这个字符串的问题

回复:
user: user-1
content: 数组b分配的空间少了

user: user-2
content: 然后 你的问题是什么 自己说清楚  贴图什么都没说明 能问的东西太多  没人知道你想知道什么

user: user-2
content: b[10]太短  数组越界 而且b 没有字符串尾部的0

user: user-0
content: 这是为什么了
user-0 提问: C语言初学者求解答，这个程序哪里出问题了？

回复:
user: user-0
content: 请教各位，这个程序有更好的实现方式吗？或者哪些地方还可以改进？

user: user-0
content: 请教各位，这个程序有更好的实现方式吗？或者哪些地方还可以改进？

user: user-0
content: @fly_dragon_fly 发现了，感谢~！

user: user-1
content: str [i] = str [length - i] 差1

user: user-0
content: @misskissC 是不是还有其次。。？

user: user-2
content: int i, length;       while (str[i++])        //length用来保存字符串的长度         length++;  首先，i和length未经赋值
user-0 提问: 求余数

回复:
user: user-0
content: 11 楼谢了。

user: user-1
content: % 计算多次跟一次是一样的？ 也就是 a%b == a%b%b == a%b%b%b   ... %也可以说是一个幂等操作了

user: user-2
content: 引用 6 楼 u014444402 的回复:aa%m = (a*10+a)%m = (a*10%m+a%m)%m =  (a*10%m+a)%m 正解！这就是简单的数论问题

user: user-0
content: 谢谢  6  8  楼，帮我解释一下，谢了。

user: user-0
content: 7楼    aa是十位是a各位也是a的数。。。    8  楼   这个是数论吗？怎么得出这个结论的。网上看了一下没有太明白

user: user-3
content: aa%m==（a*10%m+a）%m aa是说一个数还是一个2位数十位是a个位是a？

user: user-4
content: aa%m = (a*10+a)%m = (a*10%m+a%m)%m =  (a*10%m+a)%m

user: user-0
content: 对不起，，表达的不清楚。。我想问的是   aa%m==（a*10%m+a）%m  这个样子为什么是对的，怎样推出来这个的。

user: user-5
content: 表达式必须是可修改的左值，VS和GCC都没有通过编译，不建议这么写。 楼主的编译器允许这样的行为，那要追究楼主的编译器把程序编译成了什么样子，然后才能得出这样的语法合法是什么意思。

user: user-3
content: 右边的余数赋给左边的余数  不知道有什么意义

user: user-6
content: 根据表达式优先级计算就是了
user-0 提问: C语言字符串的问题，不是很懂，求解答！

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

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

user: user-0
content: 懂了，谢谢了

user: user-2
content: 引用 2 楼 USE_R_NAME 的回复:谢谢，后面的懂了，第一个问题还有点疑问。 for(i=0;i<n;i++)  {  scanf("%s",string[i]);  } 那在输入的这个过程中[i][j]都是怎么变化的啊？就像我这像输入 先输入个4 然后as bs cs ds        string[0]，[1]，[2]，[3]表示的是占得是第几行。。然后后边的[j]，表示的就是字符串的具体内容呗？ string[0]存储as  string[0][0]存储a  string[0][1]存储s   其他的以此类推

user: user-0
content: 谢谢，后面的懂了，第一个问题还有点疑问。 for(i=0;i<n;i++)  {  scanf("%s",string[i]);  } 那在输入的这个过程中[i][j]都是怎么变化的啊？就像我这像输入 先输入个4 然后as bs cs ds        string[0]，[1]，[2]，[3]表示的是占得是第几行。。然后后边的[j]，表示的就是字符串的具体内容呗？

user: user-3
content: 首先  因为你定义的是字符数组  就像一个矩阵 每个方格里放一个字符  scanf("%s",string[i]); 输入一个字符串 而c语言里字符串使用字符数组存储的  矩阵的一行代表输入的一个字符串   第二个问题  因为%s输入的是字符串  遇到换行 就会认为一个字符串结束  开始一个新的字符串  换行会自动去掉的
user-0 提问: 约瑟夫问题

回复:
user: user-0
content: 为什么多次循环后还是减n

user: user-1
content: [1，n]，看成重复的， p是总步长，p<n，显示就是出局的人， 看第一次p>n时，先不考虑出局人，则应该落在p-n处，现在考虑前面有多少人出局，只需要考虑在[1，p-n-1]之间有多少人出局，步长为m， 出局之后就变成以m-1为间隔了，所以 出局为(p-n-1)/(m-1) , 加上刚才的p-n为实际位置，循环这过程一直到p<n

user: user-0
content: 第二个while要是多次循环有咋理解

user: user-0
content: 我想知道我上面发的那个算法的解释

user: user-1
content: 用list简单，它是循环双链，iterator不停advance就可以了

user: user-2
content: <pre name="code" class="cpp">#include <iostream> #include <list> #include <vector> #include <algorithm> using namespace std; vector<int> yuesefeng(int n,int m); void main() { 	int n,m; 	cin>>n>>m; 	vector<int> out; 	out=yuesefeng(n,m); 	int i,len=out.size(); 	for(i=0;i<len;i++) 		cout<<out[i]<<" "; 	system("pause"); } vector<int> yuesefeng(int n,int m)//n代表初始人数，m代表初始号码 { 	vector<int> out; 	list<int> in; 	list<int>::iterator pos; 	int i; 	for(i=1;i<=n;i++) 		in.push_back(i); 	pos=in.begin(); 	int kk=m;     while(in.size()!=0) 	{	 		if(kk!=1) 		  { 			  pos++; 			  kk--; 		   if(pos==in.end())//注意要判断是否到尾部了，到尾部就指向头部 			pos=in.begin(); 		   } 		else 		{ 			out.push_back(*pos);//到数了，点到的人保存到输出 			pos=in.erase(pos);///将此人从列表中删除，注意erase返回的是下个人的指针 			if(pos==in.end()) 				pos=in.begin(); 		}	     	} 	return out; }  这是我以前写的，用stl 中的list来做，你可以参考下
user-0 提问: 汇编问题，sse的movdqa指令报错

回复:
user: user-1
content: 1. 可能IDE对源代码修改处理后再交给编译器。 2. 按照Intel的习惯，例如这句movdqa XMM0,  [eax]，内存寻址应该加上指针类型，（猜的）

user: user-2
content: 寄存器前加%%，比如%%xmm0

user: user-3
content: 经测试，源代码不做任何改动，6.15、7.0、8.0、9.0均可编译

user: user-0
content: 我查过了，movdqa，pshufd，pshuflw都是sse2的指令，而我现在的.xmm只是开启了sse的寄存器，是不是还有类似的打开sse2的指令的伪指令呢？？？？

user: user-0
content: 引用 2 楼 movsd 的回复:需要6.15以上的ml.exe才支持SSE2指令  安装了8.0，试过后还是不行的

user: user-4
content: 严重怀疑楼主用的汇编器版本过低或有缺陷。

user: user-3
content: 需要6.15以上的ml.exe才支持SSE2指令
user-0 提问: 找一个二维数组中在某位置上面的元素在该行上最大，在该列上最小，下面的程序哪里错了。

回复:
user: user-0
content: 引用 1 楼 user-1 的回复: {        max=a[i][j];           }           jMax = j;           iMax = i;  应该为      {        max=a[i][j];        jMax = j;      }             这是个问题 我查出来哪里有毛病了，谢谢

user: user-1
content: {        max=a[i][j];           }           jMax = j;           iMax = i;  应该为      {        max=a[i][j];        jMax = j;      }
user-0 提问: cygwin编译一个示例程序，遇到的奇怪的问题

回复:
user: user-1
content: 引用 2 楼 mybc724 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout);  这样的确是对了，但为什么没有\n，执行顺序就不对了呢，而fflush以后就对了呢？能说详细点吗？谢了啊[/quote] 发挥一下你的主观能动性。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout);  这样的确是对了，但为什么没有\n，执行顺序就不对了呢，而fflush以后就对了呢？能说详细点吗？谢了啊

user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout);
user-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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 引用 1 楼 sinat_24408145 的回复:int (*ptr)[3] = a; 这句话的意思是定义一个指针ptr，这个指针指向二维数组a，ptr就相当于a的地址   此时 ptr = a   (*ptr) [ 1 ] 是 a[0] [1]     (*ptr) [2]  是 a[0] [2]              ++ptr 就相当于  ++a  所以第七行应该就等于  a[1] [1]      a[1] [2] 可能表达的不太明白   我也是刚学到这  嘿嘿 楼上正解， ++ptr 相当于(a+1), a是数组名，不能++的

user: user-3
content: 引用 1 楼 sinat_24408145 的回复:int (*ptr)[3] = a; 这句话的意思是定义一个指针ptr，这个指针指向二维数组a，ptr就相当于a的地址   此时 ptr = a   (*ptr) [ 1 ] 是 a[0] [1]     (*ptr) [2]  是 a[0] [2]              ++ptr 就相当于  ++a  所以第七行应该就等于  a[1] [1]      a[1] [2] 可能表达的不太明白   我也是刚学到这  嘿嘿  赞成，说的比较详细

user: user-4
content: int main() { 	int a[][3] = {1,2,3,4,5,6};   //二维数组，且第二维是3个元素 	int (*ptr)[3] = a;   //第二维是3个元素的二维数组指针 	printf("%d %d ", (*ptr)[1],(*ptr)[2]); 	++ptr; 	printf("%d %d",(*ptr)[1], (*ptr)[2]); 	return 0; }

user: user-5
content: int (*ptr)[3] = a; 这句话的意思是定义一个指针ptr，这个指针指向二维数组a，ptr就相当于a的地址   此时 ptr = a   (*ptr) [ 1 ] 是 a[0] [1]     (*ptr) [2]  是 a[0] [2]              ++ptr 就相当于  ++a  所以第七行应该就等于  a[1] [1]      a[1] [2] 可能表达的不太明白   我也是刚学到这  嘿嘿

user: user-6
content: 数组指针的问题。
user-0 提问: 如图，找不出错误

回复:
user: user-1
content: 引用 12 楼 tenmenglin 的回复:[quote=引用 11 楼 bumpbee 的回复:] 要是调用getch()：头文件<conio.h>应该被包含 没用conio.h不出错..[/quote] 嗯，我理解错了 关于头文件：<>和“” ，前者一般表示标准库，后者更多是程序员自定义的头文件，用的时候没什么差别，主要是编译的时候查找，我记得，<……>头文件编译时会到标准库进行查找，“ ……” 头文件一般会选择当前文件位置，找不到才到标准库 VS里面main函数是一般定义为int，如果有了，就要加return语句，你没有定义返回值，所以也可以运行， 我不理解你为何在程序末尾加getch（）；如果是为了显示结果，可以参考十楼的意见

user: user-0
content: 引用 11 楼 bumpbee 的回复:要是调用getch()：头文件<conio.h>应该被包含 没用conio.h不出错..

user: user-1
content: 要是调用getch()：头文件<conio.h>应该被包含

user: user-2
content: 一闪而过是因为程序结束了，就把创建的控制台窗口给关了。getchar（）是获取一个字符，如果你敲过键盘，那么就有字符，获取后就过了。getch应该也一样。  你可以ctrl+F5（start without debug）来启动， 或者直接打开个控制台（cmd）窗口，然后启动你的程序， 或者用system("pause");这句，反正我觉得这句比getchar（）更好。

user: user-3
content: 你最后一句可以写成while(1);//防止控制台退出

user: user-0
content: 引用 6 楼 luciferisnotsatan 的回复:[quote=引用 5 楼 luciferisnotsatan 的回复:] 1 stdio.h这种头文件应该用尖括号<> 2 main函数要有返回类型 int main（） 3 getch不是标准的，getch在头文件conio.h里（如果你有这个的话） 4 发在C版，那你应该把文件后缀名改成.c，这样VS才会按C语言来编译。.cpp的话，是当C++来编的[/quote]  我刚刚改了，是第四点错了...忘改了 我倒  1.一定要<>括号吗？  我没用可以编译。 2.没有int  也可以编译 3.我用的getch依旧可以 我汗.. 据我所知（百度到的理解） getchar（）;  是立即结束 getch（）是等待输入任意键结束 我前俩天也纠结过这个问题，然后我发现在一个程序中 如果不 getchar（）； getchar（）； 就会一闪而过 而恰巧 getch() 不会 --- 那么能说说为什么可以编译不出错？这是特例情况？还是侥幸？诚心请教.

user: user-4
content: main() 函数没有类型

user: user-2
content: 引用 5 楼 luciferisnotsatan 的回复:1 stdio.h这种头文件应该用尖括号<> 2 main函数要有返回类型 int main（） 3 getch不是标准的，getch在头文件conio.h里（如果你有这个的话） 4 发在C版，那你应该把文件后缀名改成.c，这样VS才会按C语言来编译。.cpp的话，是当C++来编的

user: user-2
content: 1 stdio.h这种头文件应该用尖括号<> 2 main函数要有返回类型 int main（） 3 getch不是标准的，getch在头文件conio.h里（如果你有这个的话）

user: user-0
content: 引用 2 楼 luciferisnotsatan 的回复:问什么我就找到好几处问题呢？ 另外，getch不是标准C的，用getchar() 换了不对，有错误  error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

user: user-0
content: 引用 1 楼 user-5 的回复:You mean getchar() ? 这个  error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

user: user-2
content: 问什么我就找到好几处问题呢？ 另外，getch不是标准C的，用getchar()

user: user-5
content: You mean getchar() ?
user-0 提问: DLL中输出信息的问题

回复:
user: user-1
content: 你把代码贴全  或者说明白在哪里出的问题

user: user-1
content: 是我马虎了  我特地试了一下  vs2005下正常写入文件

user: user-0
content: 不用了，具体问题已经找到了。也给你评了分，鼓励你帮忙的热情。

user: user-0
content: 引用 5 楼 windzhu0514 的回复:是内存异常吧   应该是fprintf(fp,.....);  传进去的fp是个空指针    vs和codeblocks是可以调试dll的 你可以跟一下看看 如果是空指针如果通过if(fp)的？大哥哥

user: user-1
content: 是内存异常吧   应该是fprintf(fp,.....);  传进去的fp是个空指针    vs和codeblocks是可以调试dll的 你可以跟一下看看

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在微软网站上搜“C Run-Time Libraries (CRT)” 没问题啊，是使用的/MD啊

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:编译错误还是运行错误？ 运行错误

user: user-2
content: 编译错误还是运行错误？

user: user-3
content: 在微软网站上搜“C Run-Time Libraries (CRT)”
user-0 提问: 新手遇到问题求高手来解决，c语言，error LNK1120: 1 个无法解析的外部命令

回复:
user: user-1
content: 引用 4 楼 cyn2014 的回复:引用 1 楼 ccnyou 的回复:代码是可以正常编译的，整个工程打包上来吧。或者楼主说下你的项目是怎么创建的。新建了一个win32控制台应用程序，然后“完成”。 使用的是哪个版本的VS？ 我在VS2013上面按照你的方式创建，然后贴代码，只是报找不到标识符，包含 stdlib.h 可以解决。 另外，不要在CSDN上面使用私信

user: user-2
content: 有的时候先简单百度一下，也解决个差不多了

user: user-3
content: 看看是否缺少那个头文件如malloc

user: user-0
content: 引用 1 楼 ccnyou 的回复:代码是可以正常编译的，整个工程打包上来吧。或者楼主说下你的项目是怎么创建的。新建了一个win32控制台应用程序，然后“完成”。

user: user-4
content: 在stdafx.h文件中加入 #include <stdlib.h>

user: user-1
content: 代码是可以正常编译的，整个工程打包上来吧。或者楼主说下你的项目是怎么创建的。
user-0 提问: 数据结构关键路径的程序结果有误，想知道哪里错了？

回复:
user: user-0

user: user-1
content: for(i=1;i<=n;i++) 	{ 		if(G[i].id==0) 		{ 			rear++; 			stack[rear]=i; 		} 		 	} 	m=0; 	while(front!=rear) 	{ 		front++; 		j=stack[front]; 		m++; 		p=G[j].link; 		while(p!=NULL) 		{ 			k=p->adjvex; 			G[k].id=G[k].id-1; 			if(ve[j]+(p->dut)>ve[k]) 				ve[k]=ve[j]+(p->dut); 			if(G[k].id==0) 			{ 				rear++; 				stack[rear]=k; 			} 			p=p->next; 		} 输了几组数据，调试进去看，这段都没执行

user: user-2
content: 你一定要写清楚：我想做什么，我的代码出现了什么，结果那些地方和我的预料不一样，最好是你提供一组数据，然后预计这组数据应该出现什么结果但是程序出现了什么结果而让你不满意。比如我调试了一下你的代码：  但是我不知道你希望看到的结果和这组测试数据的关系。
user-0 提问: 在vs2010写c程怎么定义结构体

回复:
user: user-1
content: 这是c跟c++的一个不同之处

user: user-1
content: vs 上用c语言定义一个结构struct  title{}  ;    再定义该结构的变量时是struct   title  a;要么用typedef   title{}a,就可以直接用a去定义该结构的变量了

user: user-2
content: typedef struct _stu{     char name[9];     int score[5];     struct _stu *next; } stu;

user: user-3
content: 将文件名改成 cpp 就行了。不然标准的C写法应该是struct stu *crea(int n){}

user: user-0
content: 错误	1	error C2061: 语法错误: 标识符“stu”	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	8	1	vvvv 错误	2	error C2059: 语法错误:“}”	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	9	1	vvvv 错误	3	error C2143: 语法错误 : 缺少“{”(在“*”的前面)	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	10	1	vvvv 错误	4	error C2065: “stu”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	5	error C2065: “head”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	6	error C2065: “p1”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	7	error C2100: 非法的间接寻址	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	8	error C2065: “p2”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	9	error C2100: 非法的间接寻址	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	11	1	vvvv 错误	10	error C2143: 语法错误 : 缺少“;”(在“类型”的前面)	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	12	1	vvvv 错误	11	error C2065: “head”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	13	1	vvvv 错误	12	error C2065: “p1”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	13	1	vvvv 错误	13	error C2065: “stu”: 未声明的标识符	c:\users\administrator\documents\visual studio 2010\projects\vvvv\vvvv\vvvv.c	13	1	vvvv     只贴出来部分，后面还有一大堆

user: user-4
content: 贴错误提示一下
user-0 提问: 来帮忙  +++++++++++++++

回复:
user: user-1
content: 我的意思是，楼主要记得把局部变量【 f 】初始化一下

user: user-0
content: 引用 6 楼 wenpinglaoyao 的回复:#include "stdio.h" #define N 5 char cc(char gg[]); char cc(char gg[]) {     int i,f=0;     for(i=0;i<N;i++)     {         if(gg[i]!='\0')         {             f++;         }     }     return f; } main() {     int c;     char str[N];     printf("请输入字符");     gets(str);     c=cc(str);     printf("字符个数为%d",c);     getch(); }  你这个也犯了if错误 -~~！编译不对。

user: user-0
content: 引用 5 楼 call_from_dream 的回复:- 帮尼妹！f没初始化就用！ 我错了 --！

user: user-1
content: 注意第六行代码

user: user-1
content: #include "stdio.h" #define N 5 char cc(char gg[]); char cc(char gg[]) {     int i,f=0;     for(i=0;i<N;i++)     {         if(gg[i]!='\0')         {             f++;         }     }     return f; } main() {     int c;     char str[N];     printf("请输入字符");     gets(str);     c=cc(str);     printf("字符个数为%d",c);     getch(); }

user: user-2
content: 帮尼妹！f没初始化就用！

user: user-3
content: 比如你实际输入的字符是6个，但是你循环仍然是按照10次，第7位可能不是0了  就会出错了

user: user-3
content: 另外还是不要用gets这个函数  警告已经告诉你很详细了

user: user-3
content: 你的for循环条件有问题  既然是求字符串的长度的话  判定条件应该是gg[i] != 0;  而不是i<N

user: user-4
content: 你输入的字符是不是超过9个啦、。、
user-0 提问: 这本编译书有没有c版本的

回复:
user: user-1
content: 哪位大师教你脚本的运行必须要有虚拟机的？  引用 8 楼 ole_master 的回复:[quote=引用 6 楼 turingo 的回复:] 那就换这本书来看 http://product.dangdang.com/23493730.html  [quote=引用 4 楼 ole_master 的回复:] [quote=引用 2 楼 turingo 的回复:] 学吧！PASCAL很严谨也很容易上手，如果说C语言体现的是实干家的逻辑，那么PASCAL就是科学家的思维。  肯定不学[/quote][/quote]  虚拟机都没写过，就能写脚本语言了啊[/quote]

user: user-2
content: 解释BASIC也是一种脚本，但她不是虚拟机。

user: user-2
content: 引用 5 楼 ole_master 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 为何不研读Tiny C Compiler源代码？  你读过吗，写过c编译器吗[/quote] 读过，没写过，只写过词法分析。

user: user-1
content: 那就换这本书来看 http://product.dangdang.com/23493730.html  引用 4 楼 ole_master 的回复:[quote=引用 2 楼 turingo 的回复:] 学吧！PASCAL很严谨也很容易上手，如果说C语言体现的是实干家的逻辑，那么PASCAL就是科学家的思维。  肯定不学[/quote]

user: user-0
content: 引用 6 楼 turingo 的回复:那就换这本书来看 http://product.dangdang.com/23493730.html  [quote=引用 4 楼 ole_master 的回复:] [quote=引用 2 楼 turingo 的回复:] 学吧！PASCAL很严谨也很容易上手，如果说C语言体现的是实干家的逻辑，那么PASCAL就是科学家的思维。  肯定不学[/quote][/quote]  虚拟机都没写过，就能写脚本语言了啊

user: user-1
content: 学吧！PASCAL很严谨也很容易上手，如果说C语言体现的是实干家的逻辑，那么PASCAL就是科学家的思维。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:为何不研读Tiny C Compiler源代码？  你读过吗，写过c编译器吗

user: user-0
content: 引用 2 楼 turingo 的回复:学吧！PASCAL很严谨也很容易上手，如果说C语言体现的是实干家的逻辑，那么PASCAL就是科学家的思维。  肯定不学

user: user-2
content: 为何不研读Tiny C Compiler源代码？

user: user-3
content: http://download.csdn.net/detail/kingofking98/4008756#comment
user-0 提问: 关于win32汇编的一些问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:加上 .xmm，另外test是一条指令，不能用作函数名  非常感谢问题解决了。

user: user-1
content: 加上 .xmm，另外test是一条指令，不能用作函数名
user-0 提问: 关于用程序实现对象的匹配

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

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:仅供参考#pragma warning(disable:4786) #include <iostream> #include <string> #include <map> using namespace std; int main () {     wstring ws1,ws2;      wcin.imbue(locale("chs"));     wcout.imbue(locale("chs"));     getline(wcin,ws1);     getline(wcin,ws2);     if (ws1.size()!=ws2.size()) {         wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;         return 1;     }      map<wchar_t,wchar_t> m1,m2;     int n=ws1.size();      for (int i=0;i<n;i++) {         if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {             m1[ws1[i]]=ws2[i];             m2[ws2[i]]=ws1[i];         } else {             if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {                 wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;                 return 1;             }         }     }     wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;     return 0; } 请问老师，你能为这程序写个备注吗，我看不懂

user: user-1
content: 仅供参考#pragma warning(disable:4786) #include <iostream> #include <string> #include <map> using namespace std; int main () {     wstring ws1,ws2;      wcin.imbue(locale("chs"));     wcout.imbue(locale("chs"));     getline(wcin,ws1);     getline(wcin,ws2);     if (ws1.size()!=ws2.size()) {         wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;         return 1;     }      map<wchar_t,wchar_t> m1,m2;     int n=ws1.size();      for (int i=0;i<n;i++) {         if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {             m1[ws1[i]]=ws2[i];             m2[ws2[i]]=ws1[i];         } else {             if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {                 wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;                 return 1;             }         }     }     wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;     return 0; }

user: user-2
content: 是不是我太菜了,完全没有看懂楼主的问题.

user: user-3
content: 可以使用multimap或者自定义一个struct，记录匹配关系么,比如  struct { TCHAR a; TCHAR b[0]; }
user-0 提问: 为什么void main() {priar();prissage(); }这句放在前面编译会错误，然而放在后面居然能编译，，，，求大神告诉我原因，我用的是VC+

回复:
user: user-1
content: 标识符的作用域，傻傻没弄明白。

user: user-2
content: 缺少声明，main函数只认识在它之前的函数

user: user-3
content: 楼主的代码...   上一个通不过，是因为main在前面，不认识priar()和prissage()函数  所以要前置申明   #include <stdio.h>                                                                    #include <string.h> void priar(); void prissage(); void main() {     priar();     prissage(); } void priar() {     printf("***************\n"); } void prissage() {     printf("asddsad\n");      printf("*******************\n"); }
user-0 提问: 跪求linux下  conio.h头文件下载地址

回复:
user: user-1
content: linux下没有conio.h 使用NCURSES库。

user: user-2
content: 引用 1 楼 user-4 的回复:这玩意搜不到？？ http://download.csdn.net/detail/x931210007/4989321  这是VC目录下的，Linux环境用不了的。

user: user-2
content: 非标准头文件，建议楼主不要使用。

user: user-3
content: 这过时的玩意儿楼主要了想干嘛？

user: user-4
content: 这玩意搜不到？？ http://download.csdn.net/detail/x931210007/4989321
user-0 提问: 帮看哪里出错了 都调试一个多小时了

回复:
user: user-1
content: 引用 7 楼 tenmenglin 的回复:[quote=引用 6 楼 aqiu348503 的回复:] 你的问题是什么？ 如果第一个数据小于60循环就停止了啊，这是你程序的意图吗？ 如果数组的10个分数都要评等级，for循环里的else分支         else         {             break;         } 改为         else         {            printf("不及格%d",ixj[i]);         } 奥奥，对了。我break 他不给返回值了去。。。。[/quote] 叫你说出错误信息时就知道有这问题，原来还真是这问题；我以为你是编译不过

user: user-2
content: #include <stdio.h> int jxj(int c); int jxj(int c) { 	if(c>=90) 	{ 		return 1; 	} 	else if(c>=80&&c<90) 	{ 		return 2; 	} 	else if(c>=60&&c<80) 	{ 		return 3; 	} 	else 	{  		return 0; 	} } void main() { 	int i,a,ixj[10]; 	for(i=0;i<10;i++) 	{ 		scanf("%d",&ixj[i]); 	} 	for(i=0;i<10;i++) 	{ 		a=jxj(ixj[i]); 		if(a==1) 		{ 			printf("一等奖%d\n",ixj[i]); 		} 		else if(a==2) 		{ 			printf("er等奖%d\n",ixj[i]); 		} 		else if(a==3) 		{ 			printf("san等奖%d\n",ixj[i]); 		} 		else 		{ 			printf("0未获奖%d\n",ixj[i]); 		} 	} 	getch(); }

user: user-3
content: break改成continue，要不然只要有小于60的，后面的不会输出直接退出了。 另外，建议printf("一等奖%d",ixj[i]);里面增加一个回车printf("一等奖%d\n",ixj[i]);

user: user-0
content: 引用 6 楼 aqiu348503 的回复:你的问题是什么？ 如果第一个数据小于60循环就停止了啊，这是你程序的意图吗？ 如果数组的10个分数都要评等级，for循环里的else分支         else         {             break;         } 改为         else         {            printf("不及格%d",ixj[i]);         } 奥奥，对了。我break 他不给返回值了去。。。。

user: user-4
content: 你的问题是什么？ 如果第一个数据小于60循环就停止了啊，这是你程序的意图吗？ 如果数组的10个分数都要评等级，for循环里的else分支         else         {             break;         } 改为         else         {            printf("不及格%d",ixj[i]);         }

user: user-0
content: 引用 1 楼 linxin3333520 的回复:你最好是贴出来错误信息  无值。

user: user-0
content: 引用 3 楼 qqh_n 的回复:[quote=引用 2 楼 qqh_n 的回复:] 自定义函数里面缺少一个接收参数的变量？？  int jxj(int a) {         int c;     c=a;     if(c>=90)        {                 return 1;         }         else if(c>=80&&c<90)         {         return 2;     }         else if(c>=60&&c<80)         {         return 3;     }         else     {          return 0;     } }原来主函数有a了啊，那自定义函数里面形参改成b好了[/quote] 可以输入值 但不返回值

user: user-5
content: 引用 2 楼 qqh_n 的回复:自定义函数里面缺少一个接收参数的变量？？  int jxj(int a) {         int c;     c=a;     if(c>=90)        {                 return 1;         }         else if(c>=80&&c<90)         {         return 2;     }         else if(c>=60&&c<80)         {         return 3;     }         else     {          return 0;     } }原来主函数有a了啊，那自定义函数里面形参改成b好了

user: user-5
content: 自定义函数里面缺少一个接收参数的变量？？  int jxj(int a) {         int c;     c=a;     if(c>=90)        {                 return 1;         }         else if(c>=80&&c<90)         {         return 2;     }         else if(c>=60&&c<80)         {         return 3;     }         else     {          return 0;     } }

user: user-1
content: 你最好是贴出来错误信息
user-0 提问: c语言中static数组和非static数组编译时间差距绝大（高手进）

回复:
user: user-1
content: 其实不见得是编译器的bug，因为加上static是在运行时动态分配的存储空间，而不加的话，则是由存储器预编译阶段分配的。

user: user-2
content: 引用 18 楼 lm_whales 的回复:[quote=引用 15 楼 angel_su 的回复:] 编译器的问题吧，被你搞出bug了...  ++ 找到了一个bug 赶紧跟编译器厂家反应 估计有奖励[/quote] 微软会说，没事在代码里初始化一个200000的栈上数组的每个元素干嘛。这个用例太特殊了，不支持。

user: user-3
content: 引用 15 楼 angel_su 的回复:编译器的问题吧，被你搞出bug了...  ++ 找到了一个bug 赶紧跟编译器厂家反应 估计有奖励

user: user-3
content: 估计编译器在计算堆栈占用了多少 结果计算不出来了，陷入死循环了

user: user-4
content: 引用 3 楼 user-11 的回复:生成的 mov 指令太多了。  正解

user: user-0
content: 没有放到头文件中。

user: user-5
content: lz不会是将这么大的数组放进头文件了吧？不然就一个文件对这个数组初始化，不可能会很慢的。当然这么大的数组我也是醉了。

user: user-6
content: 把数组改小一点，编译好后看看汇编文件就什么都明白了

user: user-0
content: 这个程序我跑了24个小时都没编译完，我已经终止了。

user: user-7
content: 编译器的问题吧，被你搞出bug了...

user: user-8
content: 想深究的话，可以用gdb调试gcc或g++编译你的代码。

user: user-2
content: 引用 12 楼 thinkperson_x201 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 你说的很对，我想知道的是：为什么使用栈空间，当数组元素很大的时候，编译速度会变态的慢？[/quote]  说不定vs编译时，先把生成指令放在一个动态数组里。然后这个数组不是用均摊算法，而是有个最大增长上限，如我以前看得MFC的CArray（vs2005）源代码里，好像最多一次加512元素。大量时间都浪费在数组容量变大时做的复制粘贴上了。

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 你说的很对，我想知道的是：为什么使用栈空间，当数组元素很大的时候，编译速度会变态的慢？

user: user-8
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-9
content: 一晚上这是多么夸张？！

user: user-0
content: 可不可以这样理解：加上static，用的存储时全局的，程序运行的时候再对数组初始化；不加static，用的是栈的空间，需要在编译阶段预先为数组分配空间，时间都花费到数组空间的预分频和初始化上面了。不知道我的理解对不对？

user: user-10
content: 同意user-11。进一步说明，static之后，那些东西在编译阶段直接写到exe里面去了，用的时候系统直接用映射的方式来获取。不加的话，就是好多好多的mov

user: user-11
content: 生成的 mov 指令太多了。

user: user-0
content: 结构体很小，另外，200000是个极限值，一般为4000多，但即使4000，编译时间也很长（一分钟以上）；如果加上static修饰，瞬间完成编译。

user: user-2
content: 不清楚为什么编译要那么久，但200000个元素放栈上，你不怕运行时把栈崩了？
user-0 提问: 求个关于位的算法

回复:
user: user-1
content: ((147>>1)&0x70)|(147&0x0F)

user: user-2
content: #define bit(x)   (1<<(x))  int clrbit(int number, int n) {        number = (number & (~bit(n)));      return number; }  int main(void) {         int in, i;        scanf("%d", &in);       scanf("%d", &i);    in = clrbit(in,i); printf("%d\n",in); return 0; }

user: user-2
content: #define bit(x)   (1<<(x))  int clrbit(int number, int n) {        number = (number & (~bit(n)));      return number; }  int main(void) {         int in, i, out=0, k = 1;        scanf("%d", &in);       scanf("%d", &i);    clrbit(in,i); printf("%d\n",in); return 0; }

user: user-3
content: #include <stdio.h>  int main() {    int in, i, out=0, k = 1;    scanf("%d", &in);    scanf("%d", &i);    while (in>0)    { 		if (i!=0) 		{ 			out = out  + k * (in % 2) ; 			k=k*2 ; 		} 		in = in / 2; 		i--;    }    printf("%d  ",out);    return 0; }
user-0 提问: 有谁会编译64位的QtCreator？

回复:
user: user-1
content: 我也遇到了这个问题 但是切换到amd64选项的时候就可以编译了

user: user-2
content: 有个参考网站： http://sourceforge.net/projects/qtx64/?source=typ_redirect

user: user-0
content: 难到要结帖给分么

user: user-0
content: 不死心，求指导

user: user-3
content: 参考 http://www.cnsecer.com/695.html

user: user-0
content: QtCreactor64位的编译，知道吗？

user: user-3
content: 没有  引用 3 楼 liu15073458538 的回复:我看了，我也是这样完成编译的，VS创建Qt工程也遇到同样的问题，都已经解决了 我想问有没有直接是Windows 64的Qt版本？ 方便的话提供链接

user: user-0
content: 我看了，我也是这样完成编译的，VS创建Qt工程也遇到同样的问题，都已经解决了 我想问有没有直接是Windows 64的Qt版本？ 方便的话提供链接

user: user-0
content: 呼叫大神！！！ 大神求帮助！！！
user-0 提问: 求推荐一本编译原理的书

回复:
user: user-1
content: 龙书，虎书，鲸书

user: user-2
content: 还是建议看龙书，如果只是想简单了解，就不要挨页去读了。

user: user-3
content: 建议看《两周自制脚本语言》http://product.dangdang.com/23493730.html#ddclick?act=click&pos=23493730_0_1_q&cat=&key=%D7%D4%D6%C6%BD%C5%B1%BE&qinfo=24_1_60&pinfo=&minfo=&ninfo=&custid=&permid=20140828105933199222418451884997691&ref=http%3A%2F%2Fsearch.dangdang.com%2F%3Fkey%3D%25D7%25D4%25BC%25BA%25B6%25AF%25CA%25D6%25D0%25B4%25BD%25C5%25B1%25BE&rcount=&type=&t=1418613446000&ver=A