你好, 欢迎｡
在这节课里, 我想讲几个运算符, 它们有点奇怪,
因为你不一定会认为它们是运算符｡
因为到目前为止, 我们学过的所有运算符都是用符号来计算数字的.
这些运算符看起来有点像函数｡
我们来讨论一下sizeof运算符中的强制类型转换｡
为了先讨论转换运算符,
我必须告诉你一些类型转换, 数据是如何被转换的｡
我们学习了所有关于数据类型和不同数据类型的知识｡
但是如果你真的想把数据赋给不同的类型,
那么在c语言中会有一些隐式的转换｡
因此不同类型之间的数据转换可以自动发生, 这被称为由语言隐式转换或由程序显式转换或｡
程序员本身开发人员可以做一些事情｡
它们可以使用强制转换运算符来进行转换｡
隐式转换的数据非常重要, 因为你必须理解这一点,
因为你要开发的大多数c程序, 为了有效地开发它们, 你必须理解这些转换的规则｡
因为你经常会有整数和浮点数, 小数和整数｡
有时候你会把它们混合在一起使用｡
当你这样做的时候, 你必须知道事物是如何被转化的｡
现在, 您应该通过使用转换运算符来尽量避免这种情况｡
但是, 当您不使用cast运算符时, 请了解发生了什么｡
当你把数据赋给不同类型的浮点数和双精度数时,
数据要么被截断, 要么被提升｡
你们会听到两个术语｡
截短意味着变得不那么精确, 提升意味着变得更精确｡
因此, 尽量不要混合使用这些类型, 但它们可能会很有用｡
主要的是我们从前面的课中知道c是非常灵活的｡
这是语言设计者有意识的决定｡
当他们想要它的灵活性, 但再次作为一个权衡, 因为这个额外的自由是给你,
你可以滥用它｡
因此, 不要滥用混合类型的想法｡
尽可能使用相同的类型, 整数对整数, 浮点对浮点｡
但是, 如果您不能理解隐式转换, 则可以理解隐式转换,
或者使用转换运算符进行显式转换｡
这又是另一个问题或者另一个概念, c是柔性的, 但你不应该滥用它｡
所以每当一个浮点数赋值给一个整型变量时, 在c中, 有int x,
float y,
x等于y.
数字的小数部分将被截断｡
所以如果你有一个数, int, x等于0, float,
f等于12｡
125, 你给f赋值, x的值就是12.
你会失去精准度的｡
这个值会被截断因为你给一个int赋值了一个float. int只知道如何存储整数｡
所以它会自动被编程语言, 编译器转换成12｡
只会储存汇入｡
现在如果你给一个整型变量赋值给一个浮点变量, 这正好相反,
它不会引起数值的任何变化｡
该值由系统转换并存储在浮点变量中｡
这样你就不用担心, 把它分配到一个流中｡
如果你把12赋给一个流, 它仍然是12, 只是12｡ 0.
当你对整数进行算术运算时,
这和赋值不同, 赋值给浮点数, 或者浮点数给整型,
这是当你有一个表达式时, 你在做一些加法, 一些减法, 不管是什么情况.
当你做减法或加法时, 你有两个操作数｡
所以一个运算符可以是整型, 一个操作数可以是浮点型.
你必须知道转变是如何发生的｡
因此,
如果表达式中有两个操作数, 并且它们都是整数, 则除法运算产生的小数部分将被丢弃｡
如果你有一个整数x, 那就是20｡
你有一个整数y, 它是12｡ 然后你用20除以12｡
你不会得到1点什么什么什么｡ 你只会得到1｡
它会丢弃所有的结果, 并把它作为一个新的整数, 因为int只存储整数｡
所以两个数都是整型数, 它们在做除法.
你不会得到浮点数｡ 你不会得到一个十进制数｡
现在如果一个运算符是整型的, 另一个是浮点型的,
那么这个运算就是浮点运算. 所以如果您有浮点数f是20
浮点数是10,
一个整型数, 如果你在这里或者12做除法, 对不起,
这更适用, 然后结果会是一个浮点数,
结果会是1点, 8888, 或者是1点, 不管是什么情况｡
您没有将此数据分配给任何对象｡ 这是一个表达式它将返回什么｡
所以两个整型数的除法运算结果是一个整数｡
一个int和double或者float, 它总是一个float, 它总是一个十进制浮点运算｡
这是隐式转换｡ 如果你什么都不做,
这就是你真正需要了解的, 程序正在为你做什么｡
但是,
您应该尝试进行一些显式转换, 这可以通过转换运算符来实现｡
这就是所谓的铸造或多或少｡
当你想转换的时候, 你会看到很多语言的转换｡
所有的转换都是显式的, 你说的是你想要的数据｡
因此, 如果可以的话,
您应该这样做, 因为否则数据可能会降级, 可能会丢失｡
如果你对两个整型数做除法,
但它们没有被整除, 你会丢失所有的数据.
因此, 您可以通过显式指定它来要求所需的精确类型转换｡
这称为转换, 它包括在数量前面加上所需类型的名称（用括号括起来）｡
所以括号和类型名都构成了cap运算符｡
您先输入左括号, 然后指定数据类型, 再输入括号｡
它会把它右边的内容, 表达式右边的内容, 或者是一个变量,
它会把它转换成括号里的内容
所以实际的类型是需要的, 比如长整型, 它代替了那个单词的类型｡
因此, 类型传递运算符的优先级高于除酉减和酉加之外的所有算术运算符｡
我们还没学过什么优先权｡
我们下节课会讲到｡
优先级基本上是指所发生的事情, 即执行操作的顺序｡
我们将提供一些例子｡ 此时,
您需要理解的是, 类型转换运算符优先于除两个一元减号和一元加号之外的所有其他运算符｡
在这个例子中, 我们有一个数字21｡
因为我们知道它是转换运算符, 因为它在括号里,
而且有类型｡ 我们基本上说的是第21次｡
51将其转换为int｡
如果你把一个浮点数转换成它,
它就变成了int, 整数, 21｡
和右边的一样, 它转化了26｡ 99到整数｡
如果你在一个语句中使用这个表达式, 它的计算结果是21加26｡
它将从0截断数据｡ 51到整数, 与0相同｡ 99.
这就是转换运算符, 括号内的任何包含数据类型的运算符｡
你会经常看到的｡
如果你说21加26, 然后把它转换成浮点数, 它只会加一个点0｡
通常, 您不会强制转换为更精确的类型, 因为您不会得到更精确的类型｡
您可以从较精确的型别转型为较不精确的型别｡
所以更像是浮点数到整型数｡
所以当你使用不同的类型时, 你会在一些程序中偶尔看到这种情况｡
如果你在做算术, 你应该尽量避免使用不同的类型｡ 但如果你做了, 你会看到这个｡
另一个运算符的大小有点奇怪, 和其他很多运算符不太相似｡
这实际上看起来像一个函数｡
但是sizeof是一个运算符｡ 它会执行动作｡
它没有做任何面向功能的事情｡
它所做的就是告诉你一个给定的类型在内存中占用了多少字节｡
所以它看起来像一个函数因为它有一个参数｡
我们将给予一个例子 但它只返回内存中的字节数｡
请记住, 根据您运行的系统､
平台､ 操作系统､
计算机体系结构､ 硬件的不同, 不同的数据类型将由不同大小的内存表示｡
例如, int在1个系统上可能是4个字节, 而在另一个系统上可能是8个字节｡
所以你可以把sizeof操作符作为一个特殊的关键字, 一个c语言中的操作符, 你可以传入一个数据类型,
它会告诉你它在内存中使用了多少字节｡
所以sizeof实际上是一个运算符, 而不是函数｡
它在编译时计算, 而不是在运行时计算, 除非在其参数中使用了可变长度数组｡
所以我们会提到这一点｡ 这基本上就是说, 如果你有一个变量在数组的sizeof中,
它在编译时, 运行时, 不会被解析, 所以知道它并不重要.
sizeof运算符的参数可以是变量､ 数组名､
基本数据类型的名称（如int
float）､ 派生数据类型的名称（任何内容）或表达式｡
所以你可以说x加y的大小｡
这基本上就是x的大小加上y的大小, 或者得到的数字｡
如果x是整数, y是整数, 它的大小是16, 它会说这是一英寸, 4字节｡
如果它是整数, 一个是浮点数, 结果是浮点数运算, 那么它应该是浮点数,
八个字节之类的.
但是你可以用它来做很多事情, 你也应该用它来做很多事情｡ 例如,
Sizeof int将导致int类型的变量占用的字节数｡
因此, 这将返回4或8, 具体取决于系统｡
您也可以将sizeof操作符应用于表达式, 正如我提到的,
结果是值的大小｡
这是面积表达式的结果｡ 所以如果两个整型值加在一起, 它们还是整型的｡
所以它还是一个尺码｡ 但是你会看到sizeof操作符在我们讨论指针的时候也被用到了｡
我想现在谈这个是因为它是一个运算符｡
但是我们会在讨论更多的概念时, 在整个课程中提供更多的例子｡
具体来说, sizeof运算符在我们讨论指针时发挥的作用要大得多,
因为当你计算要分配多少内存时, 指针就是什么, 你使用sizeof是因为你想精确｡
但你也可以用它来做其他事情｡
因此, 尽可能使用sizeof运算符, 以避免在程序中计算硬代码大小｡
硬编码大小幻数不是一件好事,
因为如果你在不同的系统上, 如果你在一个系统上硬编码4个int, 在另一个系统上可能是8,
所以尽可能多地使用sizeof, 当我们讨论指针的时候, 我们会看到它有更大的相关性｡
其他有点奇怪的运算符是星号运算符｡
你可能会对自己说星号, 我们在乘法中已经讨论过了｡
但是星号有两个操作数, 一个在左边, 一个在右边｡
如果您将星号运算符应用于一个变量,
并且您只说星星变量名, 右侧只有一个参数, 则它表示其他内容｡
它实际上代表一个指针｡
它在解除指针的引用｡
我现在不想再讲这个了因为我们在讨论指针的时候会讲到这个.
但是如果你看到像星星a这样的东西, 不要害怕这是真的｡
这是做星号的指针操作符｡
您可能还会看到问号冒号｡
这是一个用于决策的运算符｡
如果condition为真, 如果左边的值为真, 则计算冒号后面右边的值,
否则依此类推｡
这是if-else语句的简写符号｡
这是一个三元运算符, 叫做｡
但是,
我现在不想详细讨论这些, 因为我们在讨论具体的主题时, 会讨论这些｡
当我们讨论决策语句时, 我们会讨论转折算子.
当我们讨论指针时, 我们将讨论星号运算符一元｡
但是, 如果您现在看到这一点, 我想现在提到, 因为他们是技术上的运营商,
但我们将了解他们的用例时, 我们谈论这些概念｡ -谢谢—谢谢