首页 > 编程语言 >C/C++知识补充

C/C++知识补充

时间:2023-11-13 22:33:42浏览次数:29  
标签:操作数 函数 补充 知识 C++ 运算符 int 实参 变量

运算符

  • 算术运算符

  • 关系运算符

  • 逻辑运算符

  • 位运算符

  • 赋值运算符

  • 杂项运算符

运算符描述实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 为假。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 为假。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 为假。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。

 

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符描述实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

 

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

下表列出了 C 语言支持的赋值运算符

运算符描述实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :

运算符描述实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

 do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环.

如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

排序算法

堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

 函数的实参和形参:

形参(形式参数)

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参

实参(实际参数)

函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。

3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

5) 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。

文件读写

打开文件

您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。

关闭文件

为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:

 int fclose( FILE *fp );

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。

写入文件

下面是把字符写入到流中的最简单的函数:

int fputc( int c, FILE *fp );

函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。您可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:

int fputs( const char *s, FILE *fp );

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF

只要遇到一个空格,scanf() 就会停止读取

位段不能跨字节存储,不能跨类型存储

类型存储大小值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

 

类型存储大小值范围精度
float 4 字节 1.2E-38 到 3.4E+38 6 位有效位
double 8 字节 2.3E-308 到 1.7E+308 15 位有效位
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位有效位

 

  •  a,默认为10进制 ,10 ,20。
  •  b,以0开头为8进制,045,021。
  •  c.,以0b开头为2进制,0b11101101。
  •  d,以0x开头为16进制,0x21458adf。

预处理

C++的预处理功能主要有三种:

1、文件包含处理

2、宏定义

3、条件编译

宏定义:

不带参数的宏定义:用一个简单的名字来替换一个长的字符串

#define 标识符 字符串

  

带参数的宏定义:

#define 标识符(参数列表)字符串

  

#define S(a,b) a*b 定义一个宏S,它带有两个形参a、b

Area=S(2,3)相当于area=2*3

  

条件编译:(可以用来解决由于文件包含而出现的变量重名的问题)

当满足条件时对一组语句进行编译,当不满足时编译另外一组语句。

#ifdef(或者ifndef) 标识符

       程序段1

#else

       程序段2

#endif

  

指令描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

 

存储类

变量的存储类型:

局部变量:在函数或者块内定义的变量

全局变量:在块作用域中,可以通过作用域运算符::来引用与局部变量同名的全局变量

动态变量:在定义变量时分配存储空间,执行到该变量的作用域结束时,收回为其分配的存储空间。

静态变量:在程序开始执行的时候就分配存储空间。

存储类型:(存储类型)<类型><变量名表>;

 

auto 存储类

auto 存储类是所有局部变量默认的存储类。

定义在函数中的变量默认为 auto 存储类,这意味着它们在函数开始时被创建,在函数结束时被销毁。

register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

动态局部变量,存储在CPU的寄存器中,存取速度快,可以提高程序的运行速度。寄存器变量常被用作循环控制变量。

static 存储类

可以分为静态局部变量静态全局变量

静态局部变量和自动类型的局部变量不同。当调用定义该变量的函数结束后,系统并不收回这些变量占用的内存空间,当再次进行调用时,变量仍使用相同的内存空间。但是虽然静态局部变量在函数调用后仍然存在,但是它不能被其他函数引用,只能由定义它的函数引用。

#include<stdio.h>
using namespace std;
void f(int x,int y)
{
    int m=0;
    static int n=0;
    m+=x+y;
    n+=x+y;
    printf("m=%d,n=%d\n",m,n);
}
int main()
{
    int i=5,j=10,k;
    for(int k=1;k<=3;k++)
    {
        f(i,j);
    }
    return 0;
}
m=15,n=15
m=15,n=30
m=15,n=45

  

 

 1 #include <stdio.h>
 2  
 3 /* 函数声明 */
 4 void func1(void);
 5  
 6 static int count=10;        /* 全局变量 - static 是默认的 */
 7  
 8 int main()
 9 {
10   while (count--) {
11       func1();
12   }
13   return 0;
14 }
15  
16 void func1(void)
17 {
18 /* 'thingy' 是 'func1' 的局部变量 - 只初始化一次
19  * 每次调用函数 'func1' 'thingy' 值不会被重置。
20  */                
21   static int thingy=5;
22   thingy++;
23   printf(" thingy 为 %d , count 为 %d\n", thingy, count);
24 }

实例中 count 作为全局变量可以在函数内使用,thingy 使用 static 修饰后,不会在每次调用时重置。

extern 存储类

extern 存储类用于定义在其他文件中声明的全局变量或函数。当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。

#include <stdio.h>
 
int count ;
extern void write_extern();
 
int main()
{
   count = 5;
   write_extern();
}
#include <stdio.h>
 
extern int count;
 
void write_extern(void)
{
   printf("count is %d\n", count);
}

 

内联函数(inline)

就是在编译时把函数体直接插入调用处,而不是在执行中发生调用函数的控制转移,可以缩短程序的运行时间。内联函数体内一般不含有循环、Switch分支和复杂嵌套的if语句。

inline <类型> <函数名>(<形式参数表>)

  

函数的重载:

指用重名函数完成不同的功能的函数运算。编译器根据不同的参数去调用不同的重载函数。

new运算符和delete运算符

new运算符用于动态分配存储空间,并将分配内存的地址赋给指针变量

<指针变量> = new <类型>;

int *pi=new int;

<指针变量> = new <类型>(value) 这里的value为初始值,容易和下面的混淆

<指针变量> = new <类型>[<表达式>];分配指定类型的数组空间

float *p=new float[n];分配n个float类型的内存单元

  

delete运算符

delete <指针变量>

delete [<表达式>] <指针变量> 例如:delete []p;

  

引用类型变量

<类型>&<引用变量名>=<变量名>;

引用了类型主要用于函数之间传递数据

对于需要返回两个或两个以上运算结果的函数,使用引用变量。引用类型变量是已定义变量的别名;变量与引用类型共用同一存储空间。可以解决函数返回多个运算结果的问题。

#include<stdio.h>
void swap(int &rx,int &ry)
{
    int temp;
    temp=rx;
    rx=ry;
    ry=temp;
}
int main()
{
    int x=3,y=5;
    swap(x,y);
    printf("x=%d,y=%d\n",x,y);
    return 0;
}

这里形参rx,ry被定义为整型引用类型。在调用swap(x,y)函数过程中,参数的传递过程相当于执行下面的引用类型变量的语句

int &rx=x;

int &ry=y;

  

 

标签:操作数,函数,补充,知识,C++,运算符,int,实参,变量
From: https://www.cnblogs.com/zlgwzy/p/17609948.html

相关文章

  • Linux Ubuntu部署C++环境与VS Code编辑器
      本文介绍在LinuxUbuntu操作系统下,配置VisualStudioCode软件与C++代码开发环境的方法。  在文章VMware虚拟机中安装LinuxUbuntu操作系统中,我们介绍了LinuxUbuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在LinuxUbuntu操作系统中配置VisualStudioCode软......
  • C++ 字符串类 string
    @TOC前言在C++中,字符串是一种常见的数据类型,用于存储和操作文本数据。C++标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能够轻松地处理字符串。一、string类型概括std::string是C++标准库中定义的字符串类,它在<string>头文件中声明。它......
  • FTDI的MPSSE使用示例(SPI协议背景知识简介及其FT4232H配成USB to SPI使用实例)
    MPSSEApplicationExample:http://ftdichip.cn/Support/SoftwareExamples/MPSSE.htmMPSSE:AN_129FTDIUSBToJTAGTAPExampleMPSS:AN_114FTDIUSBtoSPIExampleMPSSE:AN_113FTDIUSBtoI2CExampleMPSS:AN_114FTDIUSBtoSPIExampleFTDIMPSSE(Multi-Pr......
  • 【C++】【图像处理】均值滤波和高斯滤波(低通滤波)算法解析(以.raw格式的图像为基础进行
    1voidmeanFilter(BYTE*image,intwidth,intheight,BYTE*outImg)2{3//均值滤波4intsmth[9];5inti,j,m,n;6BYTEblock[9];78//高斯卷积核初始化9smth[0]=1,smth[1]=2,smth[2]=1,10smth[3]=2,......
  • C++界面库(十几种,很全)
    C++界面库是用于GUI界面设计的工具包,可以帮助开发人员快速开发出美观、易用的界面。在选择C++界面库的时候,开发人员需要根据项目要求、使用场景、开发难易程度以及所适配的操作系统等因素进行综合考虑。 下面列举了十几种常见的C++界面库,简单介绍它们的安装、使用、特点和适用......
  • Android C++ 打印(调用)堆栈
    C++Android12编译依赖库:libutilscallstack头文件:#include<utils/CallStack.h>代码:CallStackstack;stack.update();stack.log("TAG");打印callingpid#include<binder/IPCThreadState.h>IPCThreadState::self()->getCallingPid(); //占位用......
  • 职场小白必备知识点-传输层常见问题
    传输层的主要功能是什么?分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务。传输层如何区分不同应用程序的数据流?因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应这个程序,而不需要知道这个服务程序是干什么的。因此,我们只需要能够抽象的表示出来这些应......
  • C++编程爬虫代码全过程分享
    以下是使用C++编写一个爬虫程序的基本步骤和代码示例:1、首先,我们需要包含必要的库文件。在这个例子中,我们将使用<iostream>、<string>和<curlpp/cURLpp.hpp>库。#include<iostream>#include<string>#include<curlpp/cURLpp.hpp>#include<curlpp/Easy.hpp>#include<curlpp/......
  • 【1111算法题】蓝桥杯 c++(一)第一二题
    【1111算法题】第一题双十一的祈祷【算法赛】题目双十—,不仅是购物狂欢节,更有"光棍节"之称。这源于11:11由四个1构成,象征着单身。作为大学生的小蓝也想经历甜甜的校园恋爱,于是他找到了爱神丘比特,向他祈祷能为自己带来—段邂逅。丘比特是乐于助人的,他承诺小蓝只要回答出一个简......
  • Java核心知识体系6:集合框架详解
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解1集合框架图总览我们来简单解读下上面这个框架图:所有集合类都位于java.util包下Iterator是遍历集合的工具......