C语言中out和ref的区别是什么?

ref:相当于c语言的引用参数  实参和形参一起变。

out:多用于输出参数  就是在return之前必须给out标示的参数赋值。

C语言的基本特性:

1、C是高级语言:它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

2、C是结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于编码、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

3、C语言功能齐全:具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。

4、C语言适用范围大:适合于多种操作系统,如Windows、linux、DOS、UNIX等等;也适用于多种机型。C语言对编写需要硬件进行操作的场合,优于其它高级语言,有一些大型应用软件也是用C语言编写的。

5、C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。

6、C语言文件由数据序列组成:可以构成二进制文件或文本文件常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc,xcode(mac os x)等。

新特性

1、对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及<stdalign.h>头文件。

2、_Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。

3、_Generic 关键字。 

4、多线程(Multithreading)支持,包括:_Thread_local存储类型标识符,<threads.h>;头文件,里面包含了线程的创建和管理函数。 

5、增强的Unicode的支持,基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>. 

6、删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。 

7、增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。 

8、增加了更多浮点处理宏。 

9、匿名结构体/联合体支持,这个在gcc早已存在,C11将其引入标准。 

10、静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。 

11、新的 fopen() 模式,(“…x”),类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。

12、新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。

13、_Atomic类型修饰符和<stdatomic.h>头文件。

还是以例子来说明吧;
1. ref:
int i =0;
有函数fun(ref i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下两段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(1)的输出是1,(2)的输出是3,

2. out:
int i; //注意,这里只是声明了变量i,并没有对其初始化
有函数fun(ref i)、fun(out i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下三段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString());
(1)和(2)在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“i”
而(3)能正常编译,而且输出3

最后总结一下:
Ref和Out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。稍有不同之处是:
使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化。
使用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。

在C语言中,ref相当于c语言的引用参数,实参和形参一起变。out多用于输出参数,就是在return之前必须给out标示的参数赋值。这就是out和ref的区别。

  out与ref的区别如下:
  private void button1_Click(object sender, EventArgs e)
  {
  //ref,out都能修改传进来的参数的值。
  int refInt = 100;
  RefValue(ref refInt);
  MessageBox.Show(refInt.ToString());
  //
  int outInt = 100;
  outValue(out outInt, 100);
  MessageBox.Show(outInt.ToString());
  }
  //ref
  public void RefValue(ref int refInt)
  {
  refInt += 100;//ref引用不需要初始化
  }
  //一个函数可以有多个ref参数
  public void RefValue(ref int refInt,ref int rInt)
  {
  refInt += 100;//ref引用不需要初始化
  }
  //out
  public void outValue(out int outInt, int i)
  {
  outInt = i + 100;//out引用必须初始化
  }
  /*函数不可以有多个out参数
  public void outValue(out int outInt, out oInt,int i)
  {
  outInt = i + 100;//out引用必须初始化
  }*/

相关内容

猜你喜欢
热门内容