听说学完这些你就可以出师了?

简介: 看到这篇文章,你就离出事儿……哦,不,是出师就不远了,因为第一阶段的学习已经告一段落了!怎么样,开不开心,意不意外 o(* ̄︶ ̄*)o ~~~ 今天将会补充之前没有覆盖的一些零零散散的内容。好啦,开始进入正文了! 1 赋值运算符 赋值运算符是 C 语言中用得最多的一个运算符,它设计的简便与否直接影响到了 C 语言的开发效率。

看到这篇文章,你就离出事儿……哦,不,是出师就不远了,因为第一阶段的学习已经告一段落了!怎么样,开不开心,意不意外 o(* ̄︶ ̄*)o ~~~

今天将会补充之前没有覆盖的一些零零散散的内容。好啦,开始进入正文了!

1

赋值运算符

赋值运算符是 C 语言中用得最多的一个运算符,它设计的简便与否直接影响到了 C 语言的开发效率。因此它的语法为将右边的值放到左边的变量里边,因为它的执行方向是自右向左,比如

6a0dc75fb67477204620169f6f8637afeef3cba9

需要注意的是赋值运算符的左边必须是一个 lvalue,变量名就是 lvalue,但常数就不是了,所以你把 5 写在赋值号的左边就会出错,比如说执行

7c54e3d546463bac0dd7c117e52740bb4feb0fef

编译系统会提示类似于“error: lvalue required as left operand of assignment”的错误。很多人在这里将 lvalue 理解为左值,即“left value of the赋值运算符”,对应的将 rvalue 理解为右值。但是这是一种不完全正确的理解方式。那到底什么是 lvalue 什么是 rvalue 呢?

1.1

lvalue 与 rvalue

将 lvalue 和 rvalue 理解为左值和右值实际上理解并不全面,并且常常容易犯思想上的错误。一种更合理的解释是 lvalue 指用于识别或定位一个存储位置的标识符,同时还必须是可改变的;rvalue 你可以理解为 readable value,即任何可读取的值都被认为是右值(非左值)。比如尝试执行下面这段代码

42f00d66e44d97f3551e9bfa00d24dc41d7f3364

在这里如果你认为 lvalue 只是赋值运算符左边的值(即左值),那这个错误提示就无法理解了。因为首先看括号内的内容 (a++),他肯定是没有问题的,那么问题肯定是出在外面的那一层 ++ 上,但是这个时候明显是问题处在 ++ 的右边而不是左边啊,应该报 rvalue 的错误,而不是 lvalue 的错误啊。

但是如果你知道 lvalue 是用于识别或定位存储位置的标识符,那么就好解释了:(a++) 是先将变量 a 的值(5)做为整个表达式的值返回,再将 a 自增 1(类似于 a = a + 1),所以++(a++); 等价于 ++(5), a = a + 1;,5 是一个常量,当然不能 5 = 5 + 1 了(即++5)~

2

复合的赋值运算符

由于赋值运算符的使用度非常高,所以 C 语言的作者也想出了如下的一些编辑的方案。

d1ccecbe1fd8b1450f00658370f913af71147171

3

自增自减运算符

当我们需要对一个变量加一或减一并赋值给自己的时候,我们可以写成 i++、i-- 或 ++i、--i 的形式。它们也被称为增量减量运算符,或 ++、-- 运算符。另外,自增、自减运算符只能作用于变量,而不能作用于常量或表示。

3.1

i++ 与 ++i 的区别

(1) i++ 是先使用变量 i 中保存的值, = 再对自身进行 ++ 运算;

(2) ++i 是先对自身进行 ++ 运算,再使用变量 i 的值(这时候变量i的值已经加 1 了)。

其实这两者间的区别很好记忆,谁在前面先执行谁,i 在前面先使用变量 i 中保存的值,++ 在前面先对自身进行 ++ 运算,比如说如下的这段代码

710f893b35c2a7342aff36cb85c2dea3d1907184

将会输出如下的结果

c189abbfab84b7f53f699f015ae8d2855deef3ee

4

逗号运算符

逗号表达式的语法是

1514a084aa9f36ee122673744d23161e0d905d40

逗号表达式的运算过程为:从左往右逐个计算表达式;逗号表达式作为一个整体,它的值为最后一个表达式(即表达式n)的值。不过,逗号运算符在C语言的所有运算符中,是优先级最低的,连赋值运算符的优先级都比逗号运算符要高,所以 a = 3, 5 相当于 

23e1738fd38ac59621b5e625195f8c5b164ace00

需要注意的是,在 C 语言中看到的逗号,不一定就都是逗号运算符,因为在有些地方,逗号仅仅是被用作分隔符而已。比如

e3b02f1354e2b1b579d1aca9dd8f8acdbe3786be

这里逗号都是作为分隔符使用,而不是运算符。

5

条件运算符

有一个操作数的运算符称为单目运算符,有两个操作数称为双目运算符,然而 C 语言还有唯一的一个三目运算符,它的作用是提供一种简写的方式来表示 if-else 语句,其语法如下

c66b9a8e932199dab27872e8e5d65368295a5727

exp1 是条件表达式,如果结果为真,返回 exp2,如果为假,返回 exp3,所以下面的代码

44a801bb9eb9674c7af94f0b055832cd1a20589d

等价于

084445e1ce419a731ef728c062ee8c706a1ee2c5

对于比较简单的条件分支,推荐使用条件运算符哦,因为他可以 增加你代码的逼格,哦不,是使你的代码变得简洁。

6

goto 语句

goto 语句可以说是一个历史遗留,因为早的编程语言都留有很多汇编语言的痕迹,goto 语句就是其中之一。goto 语句的作用就是直接跳转到指定标签的位置,其语法为:

d7a1589d95e7987fed85f670ef1d2f22540af6ea

其中标签需要被定位于某个语句的前边,比如:

7588993e0f0874b1b332cc9ba96b1cf5f1694f79

可以看到 while 本身是一个死循环,但是当执行到 i=11 的时候,会通过 goto 语句跳转到 Label 所对应的位置,执行打印输出。

开发中要尽量避免使用 goto 语句。其实就连 C 语言的作者也觉得 goto 语句非常容易被滥用,并且建议一定要谨慎使用,甚至根本不用它。但在一种情况下使用 goto 语句是情有可原的,那就是当面临要跳出多层循环的时候,使用 goto 语句要比多个 break 语句好使。

7

注释

C 语言的注释有两种方式,一种是大家常用的,将注释写在两个连续斜杠的后边:

daad64faa9db94e49afbc4b325968016f196e23e

这样每一行注释的开头都需要有两个斜杠,有时候你可能需要写多行注释,那你可以使用 /* 注释的内容 */ 来实现:

ebc840037c67ec92c497b0101653731090b7f03a

初学的程序员有的时候会滥用注释,具体来讲就是在每一段代码的后面都会加上一段注释。在实际编程中,我们需要在函数的下面使用一个跨多行的注释,主要用于介绍函数的功能,参数的含义和返回值;再有就是对于变量的命名及适用范围进行说明;最后就是在自己觉得需要地方加了……嗯,不要到处加啊 [\手动捂脸]。

原文发布时间为:2018-10-26

本文作者:独孤呆博

本文来自云栖社区合作伙伴“轮子工厂”,了解相关信息可以关注“轮子工厂”。

相关文章
|
7月前
计算机基础100题含答案
计算机基础100题含答案
|
网络协议 Linux Android开发
年前Get一个知识点|想学嵌入式开发,要学的具体有什么?​
年前Get一个知识点|想学嵌入式开发,要学的具体有什么?​
|
7月前
|
人工智能 Java 关系型数据库
985毕业,我依然过不好这一生?(大厂java开发2年被裁)
看到标题,可能很多读者朋友恐怕又要骂我了,985这个特殊的字眼也确实异常晃眼,实际上现在985,211也越来越多,它能代表你能够进入到更高的平台,拿到“高级工厂”的入场券,但并不意味着你会成为赢家,或者说也不代表着你会站在金字塔的顶端,因为顶端往往是少数人,位置有限,太挤了总会掉下来,而我就是被挤下来的那一拨人中的一个。
|
算法 大数据 程序员
膜拜!字节跳动算法国内第一人亲撰:数据结构与算法全解笔记
近些年来,算法在互联网的地位占重凸显,在各大互联网企业应用中有着举足轻重的作用。无论是面试还是笔试,算法都占据着绝大部分。 而即将到来的 金九银十”正是跳槽涨薪的最佳时机! 最近我针对各家名企IT面试知识点方面进行了总结。对当前程序员面试缺乏权威题目进行汇总,应对即将到来的金九银十。在此,给大家带来571页经典算法面试题,希望对大家有所帮助。
|
缓存 自然语言处理 JavaScript
重新回顾早已忘却的面试题
重新回顾早已忘却的面试题
|
算法 程序员 开发者
程序员苦逼生活入门总结
如何成为优秀的软件开发者,并且想要一只开发下去,保持兴趣的方法。回想走过的软件生活历程,总结一下
120 0
|
算法 安全 物联网
大学生计算机基础题(十二)
大学生计算机基础题(十二),一起来学习吧。
听说你想学Java并发编程?先把这个学了(3)上
大家好,我是指北君。 这是AQS系列的第三篇文章,也是最后一篇,如果没看过AQS系列前两篇的童鞋,建议先去公号中的"Java并发编程"专栏中把前两篇看完。这篇主要是讲AQS是如何解决线程同步通信问题的。
听说你想学Java并发编程?先把这个学了(3)上
听说你想学Java并发编程?先把这个学了(3)下
大家好,我是指北君。 这是AQS系列的第三篇文章,也是最后一篇,如果没看过AQS系列前两篇的童鞋,建议先去公号中的"Java并发编程"专栏中把前两篇看完。这篇主要是讲AQS是如何解决线程同步通信问题的。
听说你想学Java并发编程?先把这个学了(3)下