c语言符号深度理解和再认识(2)

简介: 一、注释符号初步了解一下;/* */这个是c语言风格,//是c++风格。(一)、注释的本质首先run代码引入主题

七、++和–操作符

(一)、初步了解

让代码run起来!

//前置++(先对a自增再使用)
#include <stdio.h>
int main()
{
  int a = 10;
  int b = ++a;
  printf("%d,%d\n", a, b);
  return 0;
}//输出结果:11 11 
#include <stdio.h>
//后置++(先使用再对a自增)
int main()
{
  int a = 10;
  int b = a++;
  printf("%d,%d\n", a, b);
  return 0;
}//输出结果:11 10

(二)、深入理解后置++

还是用代码看现象

#include <stdio.h>
int main()
{
  int a = 8;
  int b = a++;
  return 0;
}

来看这段代码的反汇编:

80124687608c8e3e1f785cdcb9398423.png

这样就能很好的理解为什么是先使用再自增了。

#include <stdio.h>
int main(0
{
    int a = 8;
    a++;//并没有使用
    return 0;
}

再来看这段代码的反汇编:

f21f3923982814c233b952f8fd3290cf.png

(三)、复杂表达式

#include <stdio.h>
int main()
{
    int i =1;
    int j = (++i)+(++i)+(++i);
    printf("%d\n",j);
    return 0;
}

这段代码在visual studio 2022中输出结果是12,在gcc中输出结果是10。不同的编译器有不同的计算规则。

贪心算法(表达式匹配问题)

编译器依据符号自动匹配表达式。

在visual studio 2022中,我们每输完一条语句时,当我们打上分号,按下回车换行(enter)键时,编译器会自动匹配表达式。

八、取模/取余运算问题

(一)、取整问题

通过代码看现象。run起来!

1.向0取整

#include <stdio.h>
int main()
{
  int i = -2.9;
  int j = 2.9;
  printf("%d\n", i);//输出结果是-2
  printf("%d\n", j);//输出结果是2
  return 0;
}

看图:

6339598318bef0513cc046a3d7f5ee53.png

c语言中默认是向0取整。

c语言中有一个trunc取整函数:

16d2f6a025033bc6cbc756d36844c2df.png

通过代码了解:

ced531b8cab6f3595eb6626c36291c44.png

可见trunc函数是一个向0取整函数。

2.向负无穷取整

floor函数就是一个向负无穷取整的函数。

初步了解:

839b2ae6bf6a4941ca2e0a112173f653.png

通过代码进一步了解:

b11a01082608cbba394ad1e60a1ff8b8.png

也可以这么理解:


d6b07adc7904edd90b0591027fc4b7c9.png

3.向正无穷取整

ceil函数就是一个向正无穷取整函数。

先对ceil函数进行初步认识:

576831e1a078b3c466163a0ae4b5ad27.png

通过代码来看:


be9c214edf6ebc650d8e2fcc8cb3196b.png

可以这么理解ceil函数:


6bf95098f3d3c068568687cf6637e3ce.png

4.四舍五入

round函数就是一个四舍五入函数。

初步了解:


ac7aeee85281a68333797a5aad45e344.png

通过代码来理解:

e475e5629c8fad3f1351c9495357ae20.png

5.综合

2a87fb66d0e89269ffa6927cb344495c.png

源代码:

#include <stdio.h>
#include <math.h>
int main()
{
  const char* format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n";
  printf("value\tround\tfloor\tceil\ttrunc\n");
  printf("-----\t-----\t-----\t----\t-----\n");
  printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3));
  printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8));
  printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5));
  printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3));
  printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8));
  printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5));
  return 0;
}

(二)、取模问题

1.取模概念

如果a和d两个自然数,d非零,可以证明存在两个唯一的整数q和r,满足a=q*d+r且0<=r< d,其中,q被称为商,r被称为余数。

2.负数取模

#include <stdio.h>
//visual stuio2022中
int main()
{
  int a = -10;
  int d = 3;
  printf("%d\n", a / d);//输出-3
  printf("%d\n", a % d);//输出-1
  return 0;
}//满足-10=(-3)*3+(-1)

用python环境下,-10%3=-4,-10/3=2,。不同的编译器有不同的计算规则。

3.取余和取模一样吗?

取余:尽可能让商,进行向0取整。

取模:尽可能让商,向负无穷大取整。

4.计算数据同符号

8e7206720be55dc7ba6881564726e8ab.png

利用上述a=q*d+r很好理解。不需要讲解了。

5.计算数据不同符号


c2197d9cdfe8e0f52174ab8c6c64d838.png

这也一样,利用上述a=q*d+r很好理解。

结论:如果参与取余的数据同符号,取模等价于取余;如果参与取余的两个数据符号不同,在c语言中(或者其他采用向0取整)余数符号和被除数相同

九、运算符优先级问题

404138afd3dc4b80211ca65d25fbbaec.png


这个图表就没什么好讲的了,一目了然!






















相关文章
|
6月前
|
C语言
c语言编程练习题:7-16 计算符号函数的值
请编写程序计算该函数对任一输入整数的值。
112 0
|
6月前
|
C语言 C++ 索引
C语言符号——操作符详解
C语言符号——操作符详解
C语言符号——操作符详解
|
6月前
|
存储 机器学习/深度学习 自然语言处理
【进阶C语言】编译与链接、预处理符号详解
【进阶C语言】编译与链接、预处理符号详解
63 0
|
6月前
|
C语言
C语言陷阱——无符号数和有符号数的大小比较
C语言陷阱——无符号数和有符号数的大小比较
|
6月前
|
C语言
【C语言】C语言中的符号重载
【C语言】C语言中的符号重载
87 0
|
存储 小程序 程序员
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
131 0
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
452 0
|
存储 编译器 Linux
c语言符号深度理解和再认识(1)
一、注释符号 初步了解一下;/* */这个是c语言风格,//是c++风格。 (一)、注释的本质 首先run代码引入主题:
126 0
|
机器学习/深度学习 C语言
C语言中常见的符号和注释的用法
C语言中常见的符号和注释的用法
266 0
【C语言】符号的深入理解(第二期)
上期我们讲到过逻辑或和逻辑与,他们得到的结果是真假值,但我们一定要区分清楚,按位运算符 "|" 和 "&" 与逻辑运算符 "||" "&&" 是完全两个概念。
【C语言】符号的深入理解(第二期)