c语言解释教程语言的解释

弱弱的问一下 b--&=0在c语言中的意思,谢了啊_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:455,230贴子:
弱弱的问一下 b--&=0在c语言中的意思,谢了啊收藏
#include &stdio.h&main(){int i,b,k=0;for(i=1;i&=5;i++){b=i%2;while(b--&=0)k++;}printf("%d,%d\n",k,b);}这道题最后得8,-2,可我得1,-1这是怎么回事?
三叔正版授权网游公测!
看书去,运算符的运用
while(b--&=0)k++;b每次运行完会自减1
看是否满足大于等于0这个条件
满足则执行k++;
不满足就不执行
这个循环来高深了,有点看不懂
while(b--&=0)k++;while是循环的语句,while循环条件是b-- &= 0 为真....b-- &= 0
是个逻辑表达式,假设b = 0 ,执行这句时, b-- &= 0 ,b--的值还是0, 0 &= 0为真,整个表达式的值为真,然后b--,此时b才是b-1,b=-1..然后while开始循环..
这个题目其实很简单的,主要是看懂:while (b-- &= 0)k++;这行代码,因为for循环中i从1增加到5,所以b = i % 2;中b是始终大于等于0的,因此while循环至少执行了5次,但是由于当i等于1、3、5时余数是1,当i等于2、4时余数是0,所以当i等于1、3、5也就是余数是1的时候,while循环要多运行一次即:b-- &= 0中b--可以是1或者0,所以总共是5+3次即8次:k = 8;接下来说下b,当i = 5时,b = i % 2即b = 1的,进入while循环后先:b-- &= 0,先 b &= 0,因为b = 1,所以成立再运行b--操作,b的减1操作、与k++操作//此时 b = 0然后再次判断条件:也就是b减1后的值是不是大于、等于0,由于 b = 0,所以条件成立,结算表达式后b = -1,再执行k++操作,执行后又要执行b的减1操作,即b = -1代入表达式b -- &= 0,运算后b = -2,此时又要判断条件:b = -1 &= 0;所以条件不成立,此时输出b的值,b = -2;综上所述,k = 8,b = -2;这个题目就是考的自增与自减运算符的先后运算,++i与i++,前者的话如果i的值要参与运算,那么先将i的值加1后再运算,后者是先将i的值代入运算,再将i的值加1,但是请注意:如果只是单纯的加1操作也就是说:++i 与 i++ 单独写在一行的话功能是一样的,并没有上面的情况发生。自减运算符与自增运算符的分析是一样的,参考上面的自增来判断自减。。如果还没有弄懂可以加我QQ:
只记得说题目去了。没有说 b-- &= 0的意思就是说 先将b的值运算也就是b &= 0,后再进行b -- 操作。如果是 --b &= 0 : 先进行b的减1操作即:--b,再将运算后的b的值进行表达式的判定,即运算后的b &= 0不。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或零基础学C语言_百度百科
零基础学C语言
《零基础学C语言》是2009年由机械工业出版社出版的图书。本书一共分为四篇,循序渐进地讲述了C语言的语法规则和编程思想。
零基础学C语言内容简介
C语言是编程方式灵活多样、功能强大、应用广泛的一种程序设计语言。从程序设计语言的发展历程来看,尽管后来出现了以、和C#等为代表的新语言,但C语言的基础地位不可撼动。
本书的特点是内容全面、翔实,通俗易懂,循序渐进地介绍了C语言各方面的知识,重点突出。本书含有大量实例,代码短小精炼,紧扣所讲要点的本质,以加深读者的印象,同时结合笔者多年使用C语言的经验,阐述了很多代码编写技巧,读者可将代码复制到自己的机器上进行实验,自行实践和演练。
本书适合C语言的初级、中级读者阅读,并可作为开发人员的参考手册。
零基础学C语言作者简介
,毕业于,获得管理科学与工程专业硕士学位。研究方向是信息管理与电子商务。1997年7月至今,任职于计算机系,主讲数据库、C语言,管理信息系统、计算机应用基础等。有丰富的开发经验,参与开发过多个网络应用系统。近几年发表的论文有《非线性理论在电子商务中的应用》、《软件维护管理研究现状的缺陷分析》、《计算机考试系统的设计与实现》、《基于数据挖掘技术的电子政务》等。在2007年学院评估工作中,参与撰写“计算机基础课教学改革”一文,荣获学院高等职业教育教学改革理论研讨会一等奖。
零基础学C语言作品目录
写给未来的程序员
第一篇 C语言基础
第1章 踏上征程前的思想动员
第2章 跟我写HellocWorld
第3章 分解HellocWorld——最简单的组成
第4章 如何存储和获取数据——变量及数据类型
第5章 用屏幕和键盘交互——简单的输出和输入
第6章 程序的基本构成——运算符和表达式
第7章 程序的最小独立单元——语句
第8章 条件判断——
第9章 一遍又一遍——
第二篇 一窥C语言门庭
第10章 写程序就是写函数——函数入门
第11章 同一类型多个元素的集合——简单数组
第12章 C语言难点——指针初探
第13章 字符串及字符串操作
第14章 结构体、、枚举和
第15章 如何节省内存——
第三篇 C语言进阶
第16章 存储不仅仅局限于内存——文件
第17章 灵活却难以理解——指针进阶
第18章 更深入的理解——函数进阶
第19章 生存期、作用域与可见域
第20章 编译及预处理
第21章 数据结构
第四篇 C语言程序设计实例
第22章 C语言程序课程设计:游戏
附录 编码表
企业信用信息c语言链表解析_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言链表解析
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢24252627282930123456789101213141516171819212324252627282930311234
随笔 - 151
评论 - 113
本博客原创文章,欢迎转载和交流。不过请注明以下信息:
作者:TimWu
来源:/Tim
感谢您对我的支持!
随笔分类(164)
积分与排名
阅读排行榜C语言新人常见问题与错误
C语言新人常见问题与错误
不知不觉,学习C语言也快一年了。虽然有C语言课,但是老师完全让我们自己看书,在自学的过程中,和周围同学交流中,以及后来在CSDN,BCCN,百度知道看帖回帖中,也看到许多C语言新人常遇到的问题与常犯的错误。为了让新人们少走弯路少碰壁,我便打算写下此文。当然,由于我自己的水平也有限,其中可能自己也不知不觉犯了错误,望高手们果断斧正。
下面的程序,基本是摘自在CSDN,BCCN,百度知道的提问帖,以及我身边的人和我自己写的程序,限于篇幅,对于问题影响不大的部分我已经删去或改写,一些与相应问题无关的错误也一并进行了修改。对于完整的修正后的程序都在code::blocks 10.05(编译器gcc,调试器gdb,平台windows 7旗舰版)上运行过。
1、程序画面一闪而过
int main(void)
/*定义变量表示信号灯的状态*/
printf("the Red Light is 0,the Green Light is 1\n"); /*输出提示信息*/
scanf("%d",&iSignal);
/*输入iSignal变量*/
if(iSignal==1)
/*使用if语句进行判断*/
printf("the Light is green,cars can run\n");
/*判断结果为真时输出*/
if(iSignal==0)
/*使用if语句进行判断*/
printf("the Light is red,cars can't run\n");
/*判断结果为真时输出*/
解析:在XP以上的系统用win-tc,dev-cpp等IDE编译运行此程序时,无论输入什么数字,结果都是一闪而过,因为程序执行完语句后就直接退出了。
解决方案:这里有几个办法:
(1):在程序开头加上#include,然后在程序末尾加上system("pause");
此方法仅适用于MS-DOS,windows,不适用于*nix等系统
(2):在需要暂停的地方加入一个或两个getchar();
这种方法,实质上并不是暂停程序,而是让程序等待用户输入若干个回车。但是效果和暂停是相同的。
(3):在程序开头加上#include,在需要暂停的地方加入一个getch();,原理和上一种差不多。在win-tc里用得比较多。
2、if,for,while的判断后直接跟;
int main(void)
scanf("%d",&a);
if (a == 123);////错误,if(a == 123)后面不应加上;,而应该紧跟着
////{ printf();}代码
printf("ccc");
printf("ddd");
getchar();
int main(void)
printf("please input a number&2:");
scanf("%d",&n);
if(n%i==0)
printf("%d not a sushu\n",n);
printf("%d is a sushu\n",n);
解析&解决方案:见注释
3、漏头文件,main函数格式不规范
scanf("%d",&a);
printf("input %d", a);
解析:这段程序没有带上头文件stdio.h。即漏写了#include 。如果仅有scanf,printf函数的话,stdio.h是可以省略并可以正确运行的,但是这是非常不好的习惯。而main()这种写法,C89标准勉强充许这种形式,C99标准是不允许的。而void main(),至今仍未有任何标准考虑接受它。但是有些编译器的确允许。当然,这种写法广为流行,应该和老谭的书关系非常大。
解决方案:用到的头文件应该用include包含进去。main()函数应该写成int main(void)这种形式,在main()函数尾部加上return 0;
int main(void)
scanf("%d",&a);
printf("input %d", a);
4、scanf格式控制误用
int main(void)
float a,b,c;
printf("shuru 3 ge xi shu :");
scanf("%f,%f,%f",&a,&b,&c);
printf("he shi %f",a + b + c);
解析: scanf()函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入串准确匹配。否则,例如上面的程序,那么scanf()将其解释成,将键入一个数字,键入一个逗号,然后再键入一个数字,再键入一个逗号,最后再键入一个数学。也就是说必须像这样输入:2.3,5.1,3.8。如果不能精确匹配,则scanf()读取将失败。
作为编写这个程序的人,你可以按照这个格式输入,但是用户则不知应该以何种格式输入。所以应该改为scanf("%f%f%f",&a,&b,&c);
解决方案: scanf一行见解析。
5、scanf参数错误
int main(void)
char str[80];
printf("Please enter your first name");
scanf("%s", &str);
printf("Hello %s", str);
解析:scanf()中,读取int, long, float, double, char等类型的数据,是需要在第n(n&=2)个参数里加上&的,因为scanf()函数里,第n(n&=2)个参数是变量的地址,而不是变量本身:例如定义则scnaf("%d", &num);而读取字符串是不需要加上&,因为字符串的变量名本身就代表了地址。所以例子中应为scanf("%s", str);同时,这条规则对于结构体内的变量的也适用,即
struct foo {
char str[80];
那么应该是
scanf("%c%s%d", &data.ch, data.str, &data.num);
解决方案:见解析
6、数据类型混淆
int main(void)
double b=1;
for(a=1;a&=6;aA++)
printf("%ld",b);
解析:定义b为双精度浮点型,而输出使用%ld即长整型,数据类型不一致,输出为0.PS:老谭的书讲到用TC调试那一节举的例子貌似就是 后面写到printf("%f",a);产生错误的。
解决方案:把b定义为长整型long,即long b = 1;(其实这里还涉及到隐式转换,所以,更为正确的方法是把a也定义为长整型)
7、C语言中的“除法”
int main(void)
printf("请输入一个华氏温度\n");
float a,c;
scanf("%f",a);
c=5/9*(a-32);
printf("摄氏温度为%4.2f",c);
解析: C语言中,两个整型数相除,如果不能除尽,那么小数部分会直接被丢弃,即“截尾”。因此5/9的结果是0.
解决方案:应该使用类型转换,或者明确相除的两数的类型
c=(float)5/9*(a-32);
c=5.0/9*(a-32);
c=5.0/9.0*(a-32);
8、混合输入数字和字符的杯具
int main(void)
printf("Enter a character and a integer:\n");
while((ch = getchar()) != '\n')
scanf("%d", &num);
for(i = 0; i & ++i)
putchar(ch);
putchar('\n');
printf("Enter an another pair.Empty line to quit");
解析:这段程序表面看起来没有什么问题,但是,实际运行一遍的,就会发现,只输入了一组数据,程序就退出了。
在开始的时候,程序运行良好,例如输入 a 2,程序就会打印出aa。但是,程序还没响应第二次输入就退出了。
问题就出在换行符,这次是紧跟在第一个输入的2后面的那个换行符。scanf()函数将该换行符留在输入队列中,而getchar()并不跳过换行符。所以在循环的下一个周期,getchar()读取了第一次输入时的换行符,而换行符正是终止循环的条件。
解决方案:吃掉输入流中的回车即可
在while循环最后,加上以下语句
while (getchar() != '\n')
也可以加上fflush(stdin);刷新输入流。
9、i++,i++;的纠结
#include &stdio.h&
int main(void)
int i = 5;
printf("%d %d", i++, i++);
解析:这个问题,在实际编程应该是没有人会这么写的,可还是有很多初学者纠结于此。在编程这个领域里,很多时候,实践是最好的老师。对于代码有疑问,那么上机敲一遍,编译运行一遍是很好的方法。但是,在i++,i++这个方面,即使编译运行了这个程序,也不一定会有正确的结果。用VC,TC,gcc编译运行后的结果不一定相同。或者从某个角度来说,这里结果的正确与否其实并不重要了。
printf("%d %d", i++, i++);这一个语句,其中的i++,i++是未指定行为。即C语言的标准并没有指定这运算是以何种顺序进行的。如果用gcc编译加上-Wall选项,那么会有warning:
gcc 2_1.c -o 2_1 -g -Wall
2_1.c: 在函数‘main’中:
2_1.c:6:24: 警告:‘i’上的运算结果可能是未定义的
因此,要解决这个问题,最好的方法就是不要在程序中写这样的代码。
解决方案:见上。
10、60&=grade&=70
if (60 &= grade &= 70)
printf("及格");
else if(70 &= grade &= 85)
printf("良好");
解析:在数学中,60&=grade&=70这种表达是成立的,但是在C语言中,并没有这种表达。
解决方案:应该改写为
if ((60 &= grade) && (grade &= 70))
printf("及格");
11、switch接受什么值?
#include &stdio.h&
int main(void)
scanf("%lf", &choice);
switch(choice){
case 1.0 : printf("1.0");
case 2.0 : printf("2.0");
default : printf("It's not 1.0 or 2.0");
解析:这种问题同样是不会出现在实际的编程当中。但是一些C语言题目可能会这么出。switch()接受的是整数:整型或者字符型。所以,浮点型,字符串等类型是不被switch()接受的。
解决方案:无他……
12、== =的困惑
/****************************************
Copyright(C), , XX Co., Ltd.
FileName:7121.c
Author:……… Version:1.0
Time:23:06 Date:Feb 13th, 2011
Description:C Primer Plus编程练习7.12 1
Function List:
1.int main(void)
2.void count(void);
3.void show_count(void);
&author& &time& &date& &version& &desc&
……… 23:06
****************************************/
#include&stdio.h&
#include&stdlib.h&
#define STOP '#' /*以#为输入结束*/
#define SPACE ' ' /*定义空格*/
#define ENTER '\n' /*定义回车*/
/*空格计数器,换行符计数器,其他字符计数器,用户输入字符*/
int sp_count = 0;
int n_count = 0;
int other_count = 0;
void count(void);/*计数器函数*/
void show_count(void);/*报告计数结果*/
int main(void)
puts("Please enter some letters:(# to end)");
show_count();
puts("Thank you for using this program made by HerBal_Tea!");
system("pause");
void count(void)
while ((ch = getchar()) != STOP)
if (ch = SPACE)
sp_count++;
if (ch = ENTER)
n_count++;
other_count++;
}/*end of while ((ch = getchar()) != '#')*/
void show_count(void)
puts("The number of \nspace enter other");
printf("%5d%6d%6d\n", sp_count, n_count, other_count);
解析:话说我自己也犯了这个错。在数学中,=表示相等,而在很多编程语言中,=表示赋值,==才表示相等。思维惯性导致错误。而且这个错误C编译器既不会报错也不会警告。出错了检查起来非常难。我看了不下二十遍调试的值监视都找不到,最后还是一行一行源代码看,才知道是这个问题。在C语言四书五经中的 c traps and pitfalls 和 expert c programming都提到过这个问题。
解决方案:无他,唯细心。
13、溢出问题
例:求斐波那契数列的前n项
#include &stdio.h&
#define N 100
int main(void)
int fib[N];
fib[0] = fib[1] = 1;
printf("%d %d ", fib[0], fib[1]);
for (i = 2; i & N; ++i)
fib[i] = fib[i - 1] + fib[i - 2];
printf("%d ", fib[i]);
解析:在数学的概念中,整数、小数都是无限的,但是计算机中,即使是long long int或者double类型都是有一定限度的,超过限度就会溢出。即是,假设一个指针式体重秤最大量程为120KG,那么一个体重130KG的人站上去,那么指针会指向10KG的刻度处。溢出同理。而C语言,编译器是不会对溢出进行检查或者处理的。因此在编程中,应该自己估算一下数的大小,以选用合适的数据类型来表示数据。
PS:由于TC编译出的程序是16位的,所以int也是16位,很容易就会溢出。
解决方案:一方面是使用合适的数据类型,比如long ,long long 或者double。另一方面是,如果数特别大,连unsigned long long int或者连double都表示不了的时候,那么就用数组吧。不过定义数组的加减法还算好,但是定义乘除法就不是那么简单了。所以推荐新人使用第一种方法。第二种方法,可以考虑自己编个小程序实现一下。
14、四舍五入?
例:要求将输入的数按指定精度四舍五入输出
#include &stdio.h&
int main(void)
double a = 158.385427;
printf("%.2lf", a);
解析: C语言中,printf("%.2lf", num);是直接截断至小数点后两位,并非四舍五入而是类似于趋零截尾。
解决方案:如下
//四舍五入显示数字,精确由用户输入
//可辨别正负
#include&stdio.h&
#include&stdlib.h&
#include&math.h&
int main(void)
double a = 158.385427;
puts("Enter the width");
scanf("%d",&width);
a = (int)(a*pow(10,width) + 0.5)/pow(10,width);
a = (int)(a*pow(10,width) - 0.5)/pow(10,width);
printf("The result is %.*lf\n",width,a);
system("pause");
15、函数的返回值
#include&stdio.h&
double salary();/*计算工资税的函数*/
void main()
char want0;
printf("欢迎使用个人所得税计算器\n");
printf("\n");
printf("1.工资、薪金所得税计算\n");
printf("\n");
printf("请输入需要计算的税收项目序号:");
scanf("%d", &choice);
if(choice==1)
printf("%lf", result);
double salary()
double sal,
printf("请输入您的薪水:");
scanf("%lf", &sal);
if(sal&=3000)
if(sal&3000&&sal&=4500)
result=sal*0.05;
if(sal&4500&&sal&=7500)
result=sal*0.1-75;
if(sal&7500&&sal&=12000)
result=sal*0.2-525;
if(sal&12000&&sal&=38000)
result=sal*0.25-975;
if(sal&38000&&sal&=58000)
result=sal*0.3-2725;
if(sal&58000&&sal&=83000)
result=sal*0.35-5475;
if(sal&83000)
result=sal*0.45-13475;
解析:这个问题简单来说是,用户定义函数并未返回计算所得数值。往深的来说是关于存储类、链接,即变量的作用域、链接、存储时期的问题。
解决方案:
* Created on:
* Author: ice
#include&stdio.h&
double salary();/*计算工资税的函数*/
int main(void)
char want0;////这个want0变量没有使用
printf("欢迎使用个人所得税计算器\n");
printf("\n");
printf("1.工资、薪金所得税计算\n");
printf("\n");
printf("请输入需要计算的税收项目序号:");
scanf("%d", &choice);
if(choice==1)
result = salary();//要有一个值接受返回值才可以
printf("%lf", result);
double salary()
double sal,
printf("请输入您的薪水:");
scanf("%lf", &sal);
if(sal&=3000)
if(sal&3000&&sal&=4500)
result=sal*0.05;
if(sal&4500&&sal&=7500)
result=sal*0.1-75;
if(sal&7500&&sal&=12000)
result=sal*0.2-525;
if(sal&12000&&sal&=38000)
result=sal*0.25-975;
if(sal&38000&&sal&=58000)
result=sal*0.3-2725;
if(sal&58000&&sal&=83000)
result=sal*0.35-5475;
if(sal&83000)
result=sal*0.45-13475;
作者:icelights
文章源自:
相关标签:
分享即可 +1积分
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
Web前端工程师
汇聚、分享优秀的IT技术资讯、文章。我是,程小狮。欢迎关注!^_^
作者的热门手记
Copyright (C)
All Rights Reserved | 京ICP备 号-2

我要回帖

更多关于 c语言与c 的区别 的文章

 

随机推荐