C语言从零开始(六)-运算符与类型转换

今天谈到的知识其实之前或多或少都接触过了,我们再把它整理一下。编程中几个基本的动作是运算、判断和比较,我们接下来的内容就重点学习这些。

一,算术运算符

算术运算符分为单目和双目操作:

  • 单目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。
  • 双目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。

1.双目运算符

这个比较好理解,如同数学中的运算符号。

+ : 加法运算
- : 减法运算
* : 乘法运算
/ : 除法运算
% : 求余运算(又叫模运算)

重点说一下后两个运算符:

  • 除法运算符左右两边的数据类型决定了运算结果的类型。两边都是整数结果为整数,有任一方是小数,结果为小数。如果两个整数相除有余数,舍弃余数。运算符右边的数不能为0
  • 整除运算符左右两边的数据必须都是整数,结果是这两个数相除的余数值。如果能整除,结果为0

下面我们用一段代码说明这四个运算符的用法:

int a = 3;
int b = 2;

int sum, diff, product, res, mod;

// +
sum = a + b;
printf("sum = %d\n", sum);

// -
diff = a - b;
printf("diff = %d\n", diff);

// *
product = a * b;
printf("product = %d\n",  product);

// /
res = a / b;
printf("res = %d\n", res);

// %
mod = a % b;
printf("mod = %d\n", mod);

这段代码的结果如下:

运行结果

2. 单目运算符

C语言中有两个很有用的单目运算符。这两个运算符就是增1和减1运算符"++"和"--"。

  • ++ 操作数加1
  • -- 操作数减1

如:

x = x + 1;
x++;
++x;

这三句意义相同。

x = x - 1;
x--;
--x;

这三句意义也相同。

自增和自减运算需要注意这样的问题:

x = m++;
x = ++m;

这两句的结果完全不同。

x = m++; // 表示将m的值赋给x后, m加1。
x = ++m; // 表示m先加1后, 再将新值赋给x。

我们看一下这段代码:

int a = 1;
int b = 1;
int ret;

ret = a++;
printf("ret = %d, a = %d\n", ret, a);
ret = ++b;
printf("ret = %d, b = %d\n", ret, b);

结果如下:

QQ截图20151103220816.png

关于 -- 的程序大家自己实现一下,看看会是神马结果。

如果你对运算符还有什么疑问,请修改这些代码,验证你的疑问。通过代码学习永远是最好的方法。

二、赋值语句中的数据类型转换

1. 赋值运算符

这个大家都很熟悉,就是“=”。它的作用是把右边的值或计算结果赋给左边的变量。如:

int a = 0;
int a = b + c;

赋值运算有一种特殊的写法:

int a = 0;
a = a + 5;
a += 5;
a = a - 3;
a -= 3;

第二行和第三行意思相同,第四行和第五行意思相同,可以互相替换。这是一种C语言中的简便写法。

2. 类型转换

类型转换是指不同类型的变量混用时的类型改变。

2.1 隐式类型转换

基本原则:

  • 在赋值语句中, 等号右边的值转换为等号左边变量所属的类型
  • 不同类型混合计算时,结果类型为数据类型级别较高的
  • 所有的浮点预算都是以double进行的

数据类型级别顺序:

char, short < int < float < double

请看下面这段代码:

main()
{
    int a, b = 3;
    float f = 1.5;

    a = f * b; // 整数和浮点类型运算,结果为浮点类型,因为它类型级别高
    printf("a = %d\n", a);

    a = f; // 把一个浮点类型的变量赋值给整数类型,小数部分会被自动舍去
    printf("a = %d\n", a);
}

这段程序的运行结果为:

a = 4
a = 1

其他类型赋值时的隐式转换请大家自己编程实验。

这里有个重点问题需要强调,浮点类型的和整数类型计算时,结果为浮点类型。我们看一个常见问题。

main()
{
    float f;
    int a = 5;
    f = a / 2;

    printf("f = %f\n",  f);
}

这段程序的运行结果是:

f = 2.0000

原因在于,a是个整数,2也是个整数,它们的计算结果也是整数。此时,就已经舍弃了计算结果中的小数部分。因此,赋值时就自然没有小数部分。

如果我们需要得到f = 2.5怎么办呢?可以这样写:

main()
{
    float f;
    int a = 5;
    f = a / 2.0;

    printf("f = %f\n",  f);
}

因为整数a和浮点数2.0计算的结果是浮点型(double),因此保留了小数部分。之后再把=右边的double类型转换成左边的float类型。仔细想想,能理解吧。

2.2 强制类型转换

在计算中,我们常常需要主动要求计算机改变变量的类型。这是可以这样做。

(数据类型)(表达式或变量)

按照这种格式写,右边部分的类型就会被强制转换成左边括号中的类型。看看具体代码:

main()
{
    float f;

    f = 6.6 / 3;
    printf("f = %f\n",  f);

    f = (int)6.6 / 3;
    printf("f = %f\n",  f);

    f = (int)(6.6 / 3);
    printf("f = %f\n",  f);
}

结果如图所示:


运行结果

重点说一下 f = (int)6.6 / 3;和f = (int)(6.6 / 3);的区别,前者是把6.6转成int型,变成6之后再计算。后者是先计算6.6 / 3,得到结果2.2,之后再强行转换成int型。

今天先说到这里,其他的运算符下次再聊。

很多朋友来信说希望讲一些难度更高的知识点,不知道大家是否觉得这个系列讲得太基础。

我在这里做个简单调查,觉得前几篇有收获的同学请留言告诉我,觉得过于基础的同学请留言说明你们希望讲些什么知识点。

我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。


上一篇:C语言从零开始(五)-常量&变量
下一篇:C语言从零开始(七)-其他运算符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容

  • 谨记: 上帝在缔造每个人的时候,给予每个人的一切都是相同的,然而,人与人却是存在如此大的差距,记着上帝为你关上了一...
    长风留言阅读 4,821评论 0 5
  • 关于 Swift 重要这个文档所包含的准备信息, 是关于开发的 API 和技术的。这个信息可能会改变, 根据这个文...
    无沣阅读 4,257评论 1 27
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,487评论 1 51
  • 二月都要过完了,哈,好像年初定下的目标还没有怎么执行,怎么一年就过去了快六分之一了呢?一个两岁的孩子觉得时间过得慢...
    Vicever阅读 543评论 10 8
  • 我用灵魂 做成我最美的嫁衣 带着满腹的心事 与笔墨共浴 藏在婚床上的花生 是豌豆公主日夜辛勤 馈赠的礼物 绚烂的花...
    许二可阅读 300评论 1 3