网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月14日漏签0天
c语言吧 关注:801,842贴子:4,375,782
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2 3 4 下一页 尾页
  • 50回复贴,共4页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

回复:【入门贴】老是有人问我看什么书。c与指针。来一起看~~~

  • 取消只看楼主
  • 收藏

  • 回复
  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Switch
语法:switch (expression) statement
具体写法是这样的:
switch(expression){
case constant_exptession :statement
case constant_exptession :statement
}
每个case的标签必须具有一个唯一的值。常量表达式(constant-exptession)是指在编译器渐进性的求值的表达式的,他不能使任何变量。
执行过程中先计算expression的值然后匹配到case中cosntant-exptession的值,这个之后的语句都会被执行。也就是说case仅仅是语句执行的切入点。所以它经常和break连用。
所以一般是这样写的
switch(command){
case “a”:add_entry();break;
case “b”:add_entry();break;
case “c”:add_entry();break;
case “b”:add_entry();break;
case “e”:add_entry();break;
}
break语句的实际效果就是把语句列表划分为不同的部分,这样switch语句就能够看到更加传统的方式工作。
当然多个case可以连用。(最后给出例子。)
default子句
如果所有的值和exptession都不匹配这个时候就绪要default子句。(当你可以确定exptession个数的时候你可以将某一中情况断定为default,然后少写一个case。这种方法是偷懒了,看着方便。但是我不推荐。因为这样程序报错的时候不容易划分。Default子句设定的目的是为了检测非法值的。)
switch语句的执行过程(不要认为所有的switch都要break)
计算程序输入中字符,单词和行的个数。每个字符都比需技术,但是字符和制表符号同时也做为单词的终止符号使用。也就是说,但出现换行时三个计数器都必须增加。
switch(ch){
case '\n':lines+=1;
case '\t' :
case ' ':words+=1;
default: char+=1;
}这个例子的bug就是连续的空格没有办法识别。


2026-02-14 20:54:17
广告
不感兴趣
开通SVIP免广告
  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Goto
语法什么的:goto 语句标签
要使用goto先要在希望跳转的语句前面加上标签。语句标签就是标识符后面加个冒号。包含这些标签的goto语句可以出现在统一个函数中的人位置。
goto是一个恨危险的语句,在学习过程中,很容易产生对于它的依赖。(基本上没有什么用的语句,一定不要用就是了。它可以做的其他都可以做到,而且简单。)
在使用循环嵌套的时候有时候需要使用goto跳出整个循环体,这个时候就需要使用goto。
Eg:while(){
while(){
while(){
while(){
if(){}
goto quit;
}
}
}
}
quit: 终于出来了;
其实这个东西完全不用这样。这么长的语句一般都需要做成一个独立的函数,然后在goto的位置写个return就可以了。
个人认为:
不使用goto的原因:
1、将整个程序的逻辑结构摧毁的很彻底。
2、goto容易将编程是的顺序搞得很混乱。
3、起变量名字、函数名字和文件名字就已经很蛋疼了,现在你告诉我还有个标签名字?


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
总结1
c中的很多语句的行为和其他语言中的类似语句很想相似。(作为一只从java过来的孩子表示这个东西很淡疼。)if和while语句并不具有布尔类型,所以他们的测试值都是整型表达式。(新手可以直接用数值,入门可以在开始写个define,高手可以写个结构体,牛人貌似会自己定义个bool类型。)for语句是while循环的一种常用组合方式。dowhile和while很类似,不过dowhile会先执行一次之后在判断。尽量不要使用goto语句。
switch、case和break以及continue。
当需要出现一条语句但并不需要执行任何任务的时候,可以使用空语句。
然后就是c不存在任何的输入输出语句,以及异常处理语句。
总结 2
编写不会产生任何结果的表达式。
确信在if语句中的语句列表前后加上大括号。
在switch语句中,执行流意外的从一个case顺延到下一个case。
总结 3
在一个没有循环体的循环中,用一个分号表示空语句,并让它独占一行。
for循环的可读性比while循环强,因为它把控制循环的表达式收集起来放在一个地方。
在每个switch语句中都是用default语句。


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
操作符和表达式
操作符
算数操作符 + - * / %
除了%(取模)之外,其余的几个操作符都是既使用与浮点类型又适用证书类型。但操作符的两个操作数都是整数是,它执行整除操作。在其他情况下则执行浮点数除法。%为取模操作符,它接受两个整型操作数,它把左边的操作数除以右边的操作数,但他的返回值是余数。
移位操作符
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
移位操作存在两种情况。逻辑移位以及数学移位。


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一直再找工作,做项目,忙毕业设计的事情,没有时间更帖子,然后本身也看完了c与指针,懒得更这个帖子。
但是昨天找到了工作,项目也做完了,毕业设计准备放假回去搞。或者实习的时候在公司问问大神再做。
工作大概是做云计算的开发什么的。对于c语言和c++的要求比较高。所以,我觉得在看看c与指针,顺带更新下这个帖子。
(我才不会告诉你们我是懒得更新,现在回来骗经验的。)


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
移位操作符
数据在计算机中存储的时候是按照二进制的位数存储的。移位操作符就是整个数据移动一定的位数。
左移操作符<<,右移动操作符>>,两个操作数都比需是整型。
左移操作符号将数据移动之后,右边空出来的几个位将会由0补齐。左边超出的那几个位数将会丢弃。
右移操作符面临一个左移操作符不存在的问题。从左边移入新位时,可以选择两种方案,一种是逻辑移位,左边移入的位用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0.这样就能够保持原数的正负形式不变。如果值10010110右移两位,逻辑移位的结果是00100101,但算术移位的结果是11100101.算术左移和逻辑左移是相同的,它们仅仅是在右移的时候不想同,而且只用当操作数是负值时才不一样。
标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,倒是使用那一种移位方式取决于编译器。
可以搞一个测试程序看看编译器是什么?


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
位操作符
为操作符对于他们的操作数的各个位执行AND、OR、和XOR等逻辑操作。同样,汇编语言程序员对于这类的操作已经是非常的熟悉了(求大神,我在贴吧见过)。当两个位进行进行AND
操作时,如果两个位都是1,结果是1,否则结果是0。当两个位进行OR操作时,如果两个位都是0,结果是0,否则结果是1.最后,当两个位进行XOR操作时,如果两个位不同,结果是1,如果两个位相同,结果为0.
举例说明,假定变量a的二进制为00101110,变量b的二进制值为01011011.a&b的结果是00001010,a|b的结果是0111111,a^b的结果是011110101.
位的操纵
下面的表达式显示了你可以怎么样使用移位操作符和位操作符来操纵一个整型值中的单个位。表达式假定变量bit_number为一整型值,它的范围是从0到整型值的位数减1,并且整型值的位从右向左计数。
第一个例子是把指定的位设置为1,value=value|1<<bit_number
这个例子把指定的位清0.(~操作符是取反,将个操作数求补。即1变成0,0变成1)
value=value & ~(1<<bit_number);
这些变大是常常写成|=和&=操作符的形式。
最后这个例子是对指定向位进行测试,如果该位已经被设置为1,则表达式的结果为非零值。
value&1<<bit_number


2026-02-14 20:48:17
广告
不感兴趣
开通SVIP免广告
  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
赋值
赋值是表达式的一种,而不是某种类型的语句,所以只要是允许表达式出现的地方,都可以赋值。
赋值操作符把右边的操作数的值存储在右边的操作数的指定位置。但赋值也是个表达式,表达式就具有一个值。赋值表达式的值就是左边操作数的新值,它可以作为其他赋值操作符的操作数,如下面的例子:a=x=y+3;赋值操作符的结合性(求值顺序)是从右到左,所以这个表达式相当于:a=(x(=y+3));他的意思分开来写就是x=y+3;a=x;
警告:
在a=x=y+3中认为a和x 被赋予了相同的值的说法是不正确的。
如果x是一个字符型变量,那么y+3的值就会被截取一段,一边容纳与字符类型的变量中,那么a所赋的值就是这个被截短之后的值。在下面这个常见的错误中,这种截断正是问题的根源所在。
char ch;
while((ch=getchar())!=EOF)...
EOF需要的位数比字符类型值所能提供的位数要多,这也是getchar返回的一个整型值,而不是字符值的原因。然而,把getchar的返回值首先存储与ch中将导致它被截断。然后这个被截短的值被提升为整型并与EOF进行比较。这个存在错误的代码在使用有符号字符集的机器中运行时,如果去了一个值为\377的字节时,循环就会终止,因为这个值截短再提升之后与EOF相等。当者段代码再使用无符号字符集的机器上面运行时,这个循环将会永远也不会停止。


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
复合赋值运算符
到目前为止,所介绍的操作符都还有一种复合赋值的形式:
+= ,-= ,*=, /=, %=,<<=,>>=,&=,^=,!=以下仅仅讨论+=操作符,其余类似。
a+=expression等价与a=a+(expression)
唯一不同之处就是+=操作符的左操作数只求值一次。注意括号:他们确保表倒是在执行加法运算之前已经被完整求值,即使它内部包含用优先级低于加法运算的操作符。
存在两种增加一个变量值的方法有何意义?
首先,可以让程序员写的更加清楚一些。其次,编译器可以产生更加紧凑的代码。
(在数组,指针那种东西中这个可以减少运行的运算量)
提示
+=操作符的优点就是是源代码更加容易阅读和书写。


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
书上面有个程序比较好。
返回参数中值为1的个数

当然,直接下面那样也可以

结果是一样的~~~


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
单目操作符
c具有yixie单目操作符,也就是只接受一个操作数的操作符。他们是
! ++ - & sizeof ~ -- + * (类型)
!操作符对他的操作数执行逻辑反操作,如果操作数为真,其结果为假,如果操作数为假,其结果为真。和关系操作符一样,这个操作符实际上产生的一个整型结果,0或1。
~操作符对于整型类型的操作数进行求补操作,操作数中所有原型为1的位变成0,所有原先为0的为变成1。
-操作符产生操作数的负值。
+操作符产生操作数的值。换句话说就是什么都不做,这个就是为了和-对应。
&操作符产生它的操作数的地址。
*操作符是间接方位操作符,它与指针一起使用,用于访问指针所指向的值。例子:
int a,*b;b=&a;这个语句里面b的值是a的地址,*b的意思就是指向b地址的值,即a。
sizeof操作符判断他的操作数类型长度,以字节为单位表示。操作数既可以是个表达式也可以是单个变量;也可以是两边加上括号的类型名。
(类型)操作符被称为强制转换(cast),它用于显式的把表达式的值转换为另外的类型。例如,为了获得整型变量a对应的浮点数的值,可以(float)a;
强制转换这个名字很容易记忆,它具有很高的优先级,所以把一个强制类型转换放在一个表达式的前面只会改变表达式的第一个项目的类型。如果要对整个表达式的结果进行强制转换,你必须把整个表达式用括号括起来。
(然后就是一直不停的有人问我的一个蛋疼的东西,++,--)


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
++,--操作符都有两种变形。就是前缀式和后缀式。两个操作符的任意一种变种都需要一个变量而不是一个表达式作为他的操作数。实际上这个限制不是很严格。这个操作符仅仅要求操作数必须是一个“左值”,所谓的左值就是赋值运算符左边的值。这个以后说。
前缀形式的操作符出现在操作数的前面。操作数的值被增加,而表达式的值就是操作数增加后的值。后缀形式的操作符出现在操作数的后面。操作数的值仍被增加,但是表达式的值是操作数增加前的值。这个规则很容易记住,在操作数之前的操作符在变量值被使用之前旧增加了它的值,在操作数之后的操作符在变量值被使用之后才增加他的值。--操作符的工作原理与这个相同,只是他所执行的是减值操作,而不是增值操作。
例子:
int a,b,c,d;
a=b=10; a和b的值都是10;
c=++a; a的值是11,c的值是11;
d=b++; b的值是11,但是d的值是10;


  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
关系操作符
这类操作符用于测试操作数之间的各种关系。c提供的所有常见的关系操作符。不过者组操作符里面存在一个陷阱,这些操作符是:
> < >= <= == !=
前四个操作符的功能一看便知。!=操作符用于测试不相等。==操作符用于测试相等。
尽管关系操作符所实现的功能和你预想的一样,但是他们实现功能的方式可能和你预想的大相径庭。
这些操作符所产生的结果都是一个整型值,而不是一个布尔值。如果来年高端的操作数符合操作符指定的关系,表达式的结果是1,如果不符合,表达式的结果是0。关系操作符的结果都是整型值,所以它可以赋值给整型变量,但通常他们用与if和while语句中,作为测值表达式。这些语句的工作方式:表达式的结果为0,它被认为是加链表大师的结果是任何非零的值,则被认为是真。所有关系操作符的工作原理相同,如果操作符两端的操作数不符合它指定的关系,表达式结果为0,因此单纯从功能上面来说,我们并不需要额外的布尔数据类型。(事实上,c语言也没有布尔数据类型。)
自然语言中常使用=作为比较,然而c语言中使用==作为比较,=作为赋值。并不是c语言的创始人吃饱了撑的蛋疼菊紧。而是他仔细的做过统计,发现在c语言编写代码的过程中赋值使用的频率要远远大于比较。所以使用了=这个只需要敲一下的东西作为赋值,使用==需要敲两下的东西作为比较。你编码多了之后就会明白了。


2026-02-14 20:42:17
广告
不感兴趣
开通SVIP免广告
  • 御宅小受
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
逻辑操作符
逻辑操作符有&&和||
这两个操作符用于对表达式的求值,测试他们的值是真还是假。
expression1 && expression2
如果expression1和expression2都是真的,那么整个表达式的值,也就是真的。如果两个表达式的中任何一个表达式的值是假的,那么整个表达式的值就是假的。
&&操作副的优先级要比<>都要低。
尽管他的优先级低,但是仍然会对两个关系表达式施加控制。下面是它的工作原理:
&&操作符的左操作数总是首先进行求职,如果它的值为真,然后旧紧接着对右操作数进行求值。如果左操作数的值为假,那么右操作数就不再进行求值,因为整个表达式的结果一定是假。这个行为被称为“短路求值(short-sircuited evaluation)”。
所以要使用的这两个操作符 的时候注意这点。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2 3 4 下一页 尾页
  • 50回复贴,共4页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示