当前位置:首页 » 编程语言 » c语言不明白
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言不明白

发布时间: 2022-02-26 06:29:56

Ⅰ 为什么c语言我看不明白

老是看到有些朋友发帖子:

感觉对于学习c语言无从下手,特别是刚入门的朋友.看到那些奇怪的,不合常理的符号,感觉完全是摸不着路一样.

然后写这篇帖子,谈一下个人的学习方法和学习效率,希望对大家有帮助,特别是新手,

书的选择

首先选择一本或者两本,开始学习的时候,书不要过多,多了自己看不完,而且每一本书,作者都有自己的思路和写法习惯,然后现在市面上的书很多编写都不是很好,纰漏百出.看的多了反而感觉思维太混.一些印刷的错误或者其作者本来就写的不正确的程序,对于初学者或者是不懂的朋友,要花许多的时间把错误找出来.很是麻烦.我以前发的教材是北邮出版的,c语言程序设计.基本上教材上面的例子,就算照抄的话,3个就有2个要出现错误.上机课的时候,大家都不怎么会,就把例子抄下来.出了错,不能够通过编译,就不停的问老师.白白浪费了许多时间.

我感觉现在编写书的许多作者,在编写的时候,遇到些简单的程序,随手一写,然后就印刷上了书,也没经过调试得到正确的结果.最后出现了些许错误.也不管三七二十一,只要书能卖的好,就行了.这是相当不负责任的.误导读者.

开始学习,可以看看潭浩强的c程序设计,老潭的书卖得好,还是有他的理由的,错误比较少,然后讲的也比较通俗易懂,清华出的书我感觉都还可以.

习惯和方法

贵在坚持,每天看.一天不要搞懂很多的问题,但求把看过的一部分的每一个环节搞清楚,实在搞不清楚的,先跳过去,学习逐渐深入,看了后面在看前面,前后的知识是相通相连的.

我一般都会把书上的例子一个一个的敲到计算机上面,然后调试,运行.不要看过了就以为自己懂了,那是不好的,就算让你看100编,你输入到机器里面,还是可能会出错,一个简单的

main()

{ printf("hello world.") }

你就算这样背了下来,还是出错,因为你没有注意到语句少了分号,为什么这里有一个分号.只有自己把代码输入,机器编译通顺了,你才明白自己错在那里.当敲的代码越来越多,熟练度越高,编译再次出现错误,就知道错在那里.如何更正.还有一个好处就是可以发现一些错误,这些错误涉及到当前没有学习过的知识.然后通过逐渐深入的学习,在回想以前出错的,就知道当时为什么会出错.把这里改成

main()

{ print("hello world");}编译系统会报出不同的错误结果

比如这个函数没有写头文件,在某写c++的编译器中也不能通过,当你学习过c++的一些相关知识以后,你就会逐渐明白其中的道理.为什么要使用头文件等等.

错误是相当重要的,书上只会告诉你怎么写一个对的程序,程序的格式,程序怎么写.不会告诉你出了错误怎么修正,如何处理,靠自己不断的摸索,才会有新的心得和体会.

把课后的习题做完,做好,基本上都弄懂,习题是检验你这一章学习怎么样的一个标准.自己想,自己做,写出简单的算法,不懂的,上论坛,上c吧,发帖子,会有人告诉你的,

不要拿着书上的练习跑到论坛来求代码,这是不好的,也没有人愿意告诉你.谁都愿意帮助那些自己思考的朋友,不愿意帮助像乞丐一样不劳动就指望人家给你代码写好了把作业交差了事或者是只为了应付考试蒙混过关的人.那样的人不是真正的喜欢编程,不指望提高自己的水平,也不需要我们帮助.

学习后面的知识的时候,如果遇到以前的问题,再把掌握的代码敲一遍,敲两遍,敲n遍提高熟练度,更加可以发现新的问题.

mian()

{
int a = 5;
printf("%d",a);
}

谁都知道输出5,把程序改从一小处

mian()

{
int a = 5;
printf("%d");
}

程序是通不过编译呢,还是输出奇怪的字符或者地址.相信有部分朋友不知道.(我也不知道)

3不断深入

有如许多朋友发帖子说的,经常把一些时髦的语言挂到嘴边,比如说我要学c#好,还是,java好,不如把基础的东西弄懂弄通.在我看来,在没有学习好c 之前最好不要学习其他任何的语言,不要想到c#,java里面没有指针,没有复杂的东西,可以避难就易,基础的东西不学好,就像做的很华丽的豆腐渣工程,再漂亮,也是会倒的.学完了c ,学习数据结构,学完了,学习计算机编译原理,当你把这三门课都掌握的时候,再开始学习c++,c#,或者是java就很容易,也快得多,

把平时用的多的算法写下来,记住,把基础的学好以后,不断往后的学习,你会发现,知道的东西越多,不知道的东西越多,软件行业的博大精深,任何一个小的领域,比如c ,也许穷尽我门毕生的精力才发现自己错学只不过是边陲一角.

因为我自己的学习也在初学阶段徘徊,所以也不知道应该更加深入的学习的方法,但是相信知识积累到一定的程度.你自然就知道自己往哪方面发展.

Ⅱ C语言看不懂

对于第一个的一大堆的if条件语句,只能逐个的使用play_state的值去与后面的比较,当然要遵守&&运算符的短路规则,也就是对于a&&b,如果a的值为0,那么就不用去判断b是多少了,因为不管b是多少,对于&&运算符来说与0的运算其结果都为0。
至于你说的找不到play_state的值,play_state这个值,如果是在其他函数中或者if语句中定义的,那么这个值可以不用看,因为这个值是局部变量,局部变量一但离开定义他的语句块或者函数,其值将不会存在,而且在语句块或函数外的程序是看不到局部变量的。因此对于play_state的值,你应该查找,是不是定义了一个全局变量,应找到全局变量的值才是有效的值。
至于逻辑预处理指令#if,其实这个语句就与C中的if语句是一样的,如果#if后面的条件成立,则执行后面的语句,否则就跳出。并不是像你所说#ifdef语句,是否后面没有定义就不用看了,应该判断后面的条件是否成立。一般#if语句是与#define连合使用的,下面给你介绍一下#if语句。
逻辑预处理器指令:
1、逻辑#if指令:该指令原理与条件语句if相同,如果测试为真就执行后面的语句,如果为假则跳过后面的语句。该指令有两种用法,其一可以用#if指令测试某个符号以前是否用#define指令定义过,这是最常用的用法,其二可以用来测试某个条件表达式是否为真。
2、#if指令用法一:测试某个符号是否以前用#define定义过,该用法的指令如下#if
defined
标识符
….
#endif
其缩写形式为#ifdef
标识符….#endif表示如果,指定的标识符已被#define定义,则中间的语句就包含在源文件中,如果该标识符还未被#define定义,则跳过#if和#endif之间的语句,该语句以#endif结束,还要注意的是标识符前的关见字是defined比define多一个字母d。
3、测试标识符是否不存在:其语法为#if
!defined
标识符…..#endif缩写形式为#ifnedf
标识符…..#endif表示如果指定的标识符没有定义,则把#if和#endif之间的语句包含在源文件中,如果标识符已定义则跳过#if和#endif之间的代码,实标上#ifndef语句比#ifdef语句使用得更频繁,因为系统使用该语句防止头文件被多次包含,
4、防止头文件被包含多次的方:其方法为#ifndef
HY
#define
HY语句#endif程序在开始遇到标识符HY时没有被定义,这时执行后面的语句,再第二次被使用时则标识符HY已经被定义,这时不会执行后面的语句,从而防止了同一头文件被包含多次的情况。这里要注意使用#define后面定义的标识符不需要值。
5、#if语句还可以使用逻辑运算符以测试多个值,比如#if
defined
HY1&&HY2….#endif当HY1与HY2都为真时才执行,同样还可以使用其他逻辑运算符。
6、#if指令用法二:测试某个表达式的值是否为真,其语法格式为:#if
常量表达式….#endif,注意常量表达式的求值结果应是整数常量表达式,比如#if
a=2
….
#endif测试a的值是否为2,如果为2则执行#if与#endif之间的语句。
4.7、多个#if选择块:和常规的if语句一样#if也有对应的#else和#elif语句,比如#if
a=3
….
#else
….
#endif表示如果a=3则执行if后面且在#else前面的语句,如果为假则执行#else与#endif间的语句。#elif用来实现多个选择,该语句和常规语句的else
if相似,比如#if
a=1
….
#elif
a=2
….
#elif
a=3….
#else
….
#endif表示,如果a=1则执行#if后的语句,如果a=2则执行该条件后的语句。
执行开始后,按顺序先执行x=0;,因为它不在循环体内,所以只执行1次,
接下来是个循环嵌套,外层循环的for(i=1;i<n;i++)语句要执行n次,(因为要进行n次判断),内层循环要执行n+(n-1)+(n-2)+...+1次,用等差数列求和公式表示这个和,就是n(n+1)/2次

Ⅲ C语言 新手 不明白

#include是文件包含命令,作用:可以将另—个C源程序的全部内容包含进来,其形式为:#include <文件名>或#include "文件名"
通常可以把经常用到的,带公用性的一些函数或符号等集合在一起形成一个源文件,然后用此命令将这个源文件包含进来,这样可以避免在每个新程序中都要重新键入这些内容。

.h是头文件的意思.

stdio.h是标准输入输出头文件!包含这个文件可以使用库中提供的标准输入输出函数.

.h可以换成别的,但一般若是公用的函数都写成头文件的形式放在一起.

Ⅳ c语言程序,不明白

sure.
1.定义共用体变量w:
union un
{ int a;
char c[2];
}w;
在变量w中,有两个成员a 和 c共用一块空间,通常,a(int型)占4个字节,c(char)数组占了两个字节;
2.下面的赋值语句:
w.c[0]='A';w.c[1]='a';
由于a 和 c共用一块空间,这样同时也把'A'和'a'赋给了变量a,
'A'的值是0x41,'a'的值是0x61,'a'在高位,‘A’在低位,因此变量a的值是:0x6141,8进制表示是:60501
3.因此,在打印语句中8进制的输出中,
printf("%o\n",w.a);
输出为:60501
4.getchar();是个等待用户输入以结束程序运行用的。

Ⅳ C语言的几个不明白

1.printf("%d,%d,%d,%d\n",i,j,++i,j++)后面是逗号表达式,从右往左算,即:j++ ++i j i
2.弄清=是赋值,把右边变量的值给左边的变量,==是比较,判断左右的值是否相等,相等算作1,不相等算作0
3.知道ASCII码表吧,你把a保存在计算机中时,实际存的是97这个数,因为计算机是2进制,只能存数……
4.空循环很少吧,我没用过,这个例子不知道恰当不:
for(i=0; i<n; i++);/*将i加到n的大小*/
5.定义仅在他所在的语句块内有效
{
int x=6;
......
}
这个x只在两个{ }之间有效
6.所占位数指这个类型的变量保存在计算机时,占的内存大小。位 也是个大小单位,像MB,GB一样。取值范围的理解是对的。
int和short为什么相等,这个在C标准没明确规定,只说int不能小于short,所以各种编译器上,有int等于short的,也有int比short大的,一般教材以TC为准,说int和short一样

初学,如错,请斧正

Ⅵ c语言,一个语句不明白,详细给解释下

fun(s,&t),调用了上面定义的函数,传入的参数分别为数组s,t的地址, s数组名表示数组的首地址,所以不用再取地址,只需要把数组的首地址传过去就行了,c语言中数组的地址是连续的,指针的本质也是地址, 而t只是一个整型变量,不是一个地址,函数的两个参数都为指针也就是地址,所以需要把t的地址传过去

Ⅶ C语言,不明白

第一个程序
c=a;=a=b;b=c;
\
=a=b

出错
还有
你把p=&x,p=&y;
这是你的本意么?
应该
是p=&x,q=&y;才是你的本意吧
呵呵
~~
如果是
p=&x,q=&y
那第一个程序应该是:
先看
1.
#include
"stdio.h"
void
fun(int
*a,int
*b)
{
int
*c;
c=a;a=b;b=c;
\
2.
所以a,b就是&x,&y,c=a;a=b;b=c;
这句话的意
思就是把a,b里放的地址交换,则a指向了y,b指向了x;
printf("%d%d",*a,*b);
\则打印出来的值是
5
3(看下面3.)
}
main()
int
*p,*q;
{int
x=3,y=5,p=&x,q=&y;
\
1.
此时你把p,q分别指向了x,y地址
\也是就是p,q放着x,y的地址
fun(p,q);printf("%d%d",*p,*q);
\函数fun传递了p,q
(看上面
2.)
\3.
fun调用完后,打印*p,*q值是
3,5!!
惊~!为什么没交换?是不是,
很疑惑啊,看下面解释。
fun
(&x,&y);printf("%d%d",*p,*q);
}
看这个函数:
#include
void
fun(x,y)
{
int
c;
c=x;x=y;y=c;
}
main()
{
int
x=3,y=5;
fun();
printf("\n
%d
%d
",x,y);
}
输出还是3
5
为什么fun里x,y没交换,原因你可能很清楚
因为fun()x,y并不是main()里的x,y,他是在fun在另外申请两个地址来
存放3
和5的,所以fun()里x,y交换后的值与main()x,y里是不相关的;
还有c语言呢,规定只能实参给形参传递值,而反之不行,所以main里的x,y不交换。
现在回来说,
*a,
*b和*p,*q,开始
*p,*q,传递地址给*a,*b,
则p
a,
q
b,指向同一个地址,但是
p,q,和
a,b,
所在的地址确不一样
a,b,
是另外申请地址的(上面说到了),指针也是有地址的(不理解课可以看下书,指针那章),所以p
a,
q
b,虽指向同一个数但是他们却不同,c=a;=a=b;b=c;这句的只是把a,b里指向的地址交换(也就是a->y,b->x),
不关p,q事,p
,q还是指向原来的x,y.所以
输出5,3,3,5,5,3,3,5;
第二个程序:
它跟第一个函数有什么区别,区别就在这里*c=*a;*a=*b;*b=*c;
虽然p
a,
q
b不是同一个数,但是他们分别指向了同一个地址&x,&y;
*c=*a;*a=*b;*b=*c;就是让x,y的值交换,既然x,y得值都换了,那*p和*q
的值能不变么?
自己画个图,很好理解的~!

Ⅷ C语言选择,不明白

形参是你函数声明时用的参数名。

实参是你使用函数时用的参数名。

#include<stdio.h>

intadd(inta,intb);

intmain()
{
intx=1,y=2;
intz=add(x,y);//x,y为实际参数,分别对应形参a,b.
printf("z:%d ",z);
printf("a:%d ",x);//x,y实参值没有改变
printf("b:%d ",y);
return0;
}

intadd(inta,intb)//a,b是形式参数
{
intc=a+b;
a=a+1;//对形参进行运算,没有改变实参的值
b=b+1;
returnc;
}

Ⅸ c语言题目不明白

十六进制的3就是十进制的3,也就是二进制11。
unsigned char是八位(一字节),0x3表示出来就是 00000011。

Ⅹ C语言中不明白的一个问题!

不同的系统,有不同的编译器,不同的c语言环境,也有不同的编译器

编译器不需要很大的灵活性,windows上面的编译器,只需要它编译出来的东西,能在window上允许就OK了

它又不会去考虑能否在手机上运行

确实,c的编译器都不是很大!