iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言自动变量的类型有哪些及怎么用
  • 750
分享到

C语言自动变量的类型有哪些及怎么用

2023-06-27 10:06:34 750人浏览 薄情痞子
摘要

这篇文章主要介绍“C语言自动变量的类型有哪些及怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言自动变量的类型有哪些及怎么用”文章能帮助大家解决问题。关键字auto为了更清楚地表达你的意图(

这篇文章主要介绍“C语言自动变量的类型有哪些及怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言自动变量的类型有哪些及怎么用”文章能帮助大家解决问题。

关键字auto

为了更清楚地表达你的意图(例如,为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其他存储类别),可以显式使用关键字auto,如下所示:

int main(void){  auto int plox;

关键字auto是存储类别说明符(storage-class specifier)。auto关键字在c++中的用法完全不同,如果编写C/C++兼容的程序,最好不要使用auto作为存储类别说明符。

块作用域无链接意味着只有在变量定义所在的块中才能通过变量名访问该变量(当然,参数用于传递变量的值和地址给另一个函数,但是这是间接的方法)。另一个函数可以使用同名变量,但是该变量是存储在不同内存位置上的另一个变量。

变量具有自动存储期意味着,程序在进入该变量声明所在的块时变量存在,程序在退出该块时变量消失。原来该变量占用的内存位置现在可做他用。

嵌套快的情况

接下来分析一下嵌套块的情况。块中声明的变量仅限于该块及其包含的块使用。

int loop(int n){     int m;          // m in scope     scanf("%d", &m);     {          int i;    // both m and i in scope          for (i = m; i < n; i++)               puts("i is local to a sub-blockn");     }     return m;     // m in scope, i Gone}

在上面的代码中,i仅在内层块中可见。如果在内层块的前面或后面使用i,编译器会报错。通常,在设计程序时用不到这个特性。然而,如果这个变量仅供该块使用,那么在块中就近定义该变量也很方便。这样,可以在靠近使用变量的地方记录其含义。另外,这样的变量只有在使用时才占用内存。变量nm分别定义在函数头和外层块中,它们的作用域是整个函数,而且在调用函数到函数结束期间都一直存在。

如果内层块中声明的变量与外层块中的变量同名会怎样?内层块会隐藏外层块的定义。但是离开内层块后,外层块变量的作用域又回到了原来的作用域。程序hiding.c演示了这一过程。

// hiding.c -- variables in blocks#include <stdio.h>int main(){    int x = 30;      // original x    printf("x in outer block: %d at %pn", x, &x);    {        int x = 77;  // new x, hides first x        printf("x in inner block: %d at %pn", x, &x);    }    printf("x in outer block: %d at %pn", x, &x);    while (x++ < 33) // original x    {        int x = 100; // new x, hides first x        x++;        printf("x in while loop: %d at %pn", x, &x);    }    printf("x in outer block: %d at %pn", x, &x);    return 0;}

下面是该程序的输出:

x in outer block: 30 at 0x7fff5fbff8c8x in inner block: 77 at 0x7fff5fbff8c4x in outer block: 30 at 0x7fff5fbff8c8x in while loop: 101 at 0x7fff5fbff8c0x in while loop: 101 at 0x7fff5fbff8c0x in while loop: 101 at 0x7fff5fbff8c0x in outer block: 34 at 0x7fff5fbff8c8

首先,程序创建了变量x并初始化为30,如第1条printf()语句所示。然后,定义了一个新的变量x,并设置为77,如第2条printf()语句所示。根据显示的地址可知,新变量隐藏了原始的x。第3条printf()语句位于第1个内层块后面,显示的是原始的x的值,这说明原始的x既没有消失也不曾改变。也许该程序最难懂的是while循环

while循环测试条件中使用的是原始的x

while(x++ < 33)

在该循环中,程序创建了第3个x变量,该变量只定义在while循环中。所以,当执行到循环体中的x++时,递增为101的是新的x,然后printf()语句显示了该值。每轮迭代结束,新的x变量就消失。然后循环的测试条件使用并递增原始的x,再次进入循环体,再次创建新的x。在该例中,这个x被创建和销毁了3次。注意,该循环必须在测试条件中递增x,因为如果在循环体中递增x,那么递增的是循环体中创建的x,而非测试条件中使用的原始x

我们使用的编译器在创建while循环体中的x时,并未复用内层块中x占用的内存,但是有些编译器会这样做。

该程序示例的用意不是鼓励读者要编写类似的代码(根据C的命名规则,要想出别的变量名并不难),而是为了解释在内层块中定义变量的具体情况。

没有花括号的块

前面提到一个C99特性:作为循环或if语句的一部分,即使不使用花括号({}),也是一个块。更完整地说,整个循环是它所在块的子块(sub-block),循环体是整个循环块的子块。与此类似,if语句是一个块,与其相关联的子语句是if语句的子块。这些规则会影响到声明的变量和这些变量的作用域。程序forc99.c演示了for循环中该特性的用法。

// forc99.c -- new C99 block rules#include <stdio.h>int main(){    int n = 8;    printf("   Initially, n = %d at %pn", n, &n);    for (int n = 1; n < 3; n++)        printf("      loop 1: n = %d at %pn", n, &n);    printf("After loop 1, n = %d at %pn", n, &n);    for (int n = 1; n < 3; n++)    {        printf(" loop 2 index n = %d at %pn", n, &n);        int n = 6;        printf("      loop 2: n = %d at %pn", n, &n);        n++;    }    printf("After loop 2, n = %d at %pn", n, &n);    return 0;}

假设编译器支持C语言的这个新特性,该程序的输出如下:

Initially, n = 8 at 0x7fff5fbff8c8loop 1: n = 1 at 0x7fff5fbff8c4loop 1: n = 2 at 0x7fff5fbff8c4After loop 1, n = 8 at 0x7fff5fbff8c8loop 2 index n = 1 at 0x7fff5fbff8c0loop 2: n = 6 at 0x7fff5fbff8bcloop 2 index n = 2 at 0x7fff5fbff8c0loop 2: n = 6 at 0x7fff5fbff8bcAfter loop 2, n = 8 at 0x7fff5fbff8c8

需要注意的一点:

支持C99C11有些编译器并不支持C99/C11的这些作用域规则(Microsoft Visual Studio 2012就是其中之一)。有些编译会提供激活这些规则的选项。例如,撰写本书时,GCc默认支持了C99的许多特性,但是要用–std=c99选项激活程序清单12.2中使用的特性:

gcc --std=c99 forc99.c

与此类似,gccclang都要使用–std=c1x-std=c11选项,才支持C11特性

程序forc99.c第1个for循环头中声明的n,其作用域作用至循环末尾,而且隐藏了原始的n。但是,离开循环后,原始的n又起作用了。

第2个for循环头中声明的n作为循环的索引,隐藏了原始的n。然后,在循环体中又声明了一个n,隐藏了索引n。结束一轮迭代后,声明在循环体中的n消失,循环头使用索引n进行测试。当整个循环结束时,原始的n又起作用了。再次提醒读者注意,没必要在程序中使用相同的变量名。如果用了,各变量的情况如上所述。

自动变量的初始化

自动变量不会初始化,除非显式初始化它。考虑下面的声明:

int main(void){  int repid;  int tents = 5;

tents变量被初始化为5,但是repid变量的值是之前占用分配给repid的空间中的任意值(如果有的话),别指望这个值是0。可以用非常量表达式(non-constantexpression)初始化自动变量,前提是所用的变量已在前面定义过:

int main(void){  int repid;  int tents = 5;

关于“C语言自动变量的类型有哪些及怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网其他教程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: C语言自动变量的类型有哪些及怎么用

本文链接: https://www.lsjlt.com/news/309931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言自动变量的类型有哪些及怎么用
    这篇文章主要介绍“C语言自动变量的类型有哪些及怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言自动变量的类型有哪些及怎么用”文章能帮助大家解决问题。关键字auto为了更清楚地表达你的意图(...
    99+
    2023-06-27
  • C语言中的变量类型有哪些及怎么用
    本篇内容主要讲解“C语言中的变量类型有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的变量类型有哪些及怎么用”吧!一。变量的类型告诉编译器怎么处理这个变量的数据。 ...
    99+
    2023-06-16
  • Go语言的变量有哪些类型
    这篇文章主要介绍“Go语言的变量有哪些类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言的变量有哪些类型”文章能帮助大家解决问题。变量有三个类型:1、函数内定义的变量称为局部变量,其作用域仅...
    99+
    2023-07-04
  • C语言数据类型和变量常量有哪些
    这篇“C语言数据类型和变量常量有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言数据类型和变量常量有哪些”文章吧。首...
    99+
    2023-06-26
  • C语言的变量类型及内存大小详解
    类型 存储大小 值范围 c输入输出格式 ...
    99+
    2024-04-02
  • go语言有哪些类型及怎么表示
    本篇内容主要讲解“go语言有哪些类型及怎么表示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言有哪些类型及怎么表示”吧!go语言的类型有布尔型(bool)、整型(int8、byte、int...
    99+
    2023-07-04
  • Go语言的面量类型有哪些?
    go语言支持面量类型,通过语法糖方式表示特定值类型的常量,语法为type 面量类型标识符 = 面量表达式。常见用例包括表示特定范围内的常量、强制类型转换、提高代码可读性。 Go 语言中...
    99+
    2024-04-03
    go语言 面量类型 代码可读性
  • c语言怎么判断变量数据类型
    在C语言中,可以使用`sizeof`运算符来判断变量的数据类型。`sizeof`运算符返回变量或数据类型的大小(以字节为单位)。 例...
    99+
    2023-10-28
    c语言
  • c#语言的数据类型有哪些?
    c#支持多种数据类型,包括整数、浮点数、字符和布尔值等基础类型,以及字符串、数组、类和枚举等复杂类型。可以使用类型说明符(var、类型名称、泛型类型、可空类型)指定变量类型,并支持隐式和...
    99+
    2024-04-04
    c# 隐式类型转换
  • JavaScript变量类型有哪些及变量间的转换方法
    这篇文章主要介绍“JavaScript变量类型有哪些及变量间的转换方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript变量类型有哪些及变量间的转换方法”文章能帮助大家解决问题。1....
    99+
    2023-06-29
  • c++的变量和基本类型都有哪些
    本篇文章为大家展示了c++的变量和基本类型都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.类型转换对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从...
    99+
    2023-06-22
  • R语言中Factor类型变量怎么用
    这篇文章给大家分享的是有关R语言中Factor类型变量怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。factor类型的创建1. factor( )> credit_rating &...
    99+
    2023-06-14
  • c语言中的小数类型有哪些
    c 语言小数类型有:float:单精度浮点数,精度 7 位,占用 32 位内存。double:双精度浮点数,精度 15 位,占用 64 位内存。选择类型依据精度需求,精度低用 float...
    99+
    2024-04-28
    c语言 隐式转换
  • C语言中的运算类型有哪些
    这篇文章主要介绍“C语言中的运算类型有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中的运算类型有哪些”文章能帮助大家解决问题。一、概述C语言中支持下面4种类型的运算运算类型运算符四则运算...
    99+
    2023-06-30
  • Go语言中的数据类型有哪些及类型间怎么转换
    这篇“Go语言中的数据类型有哪些及类型间怎么转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的数据类型有哪些及类...
    99+
    2023-06-30
  • C语言中数据类型有哪些
    这篇文章主要为大家展示了“C语言中数据类型有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中数据类型有哪些”这篇文章吧。数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角。...
    99+
    2023-06-25
  • c语言标识符类型有哪些
    这篇文章主要讲解了“c语言标识符类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c语言标识符类型有哪些”吧!c语言标识符有三类:1、关键字,是由C语言规定的具有特定意义的字符串,通常...
    99+
    2023-07-04
  • c语言标识符有哪些类型
    本教程操作环境:windows7系统、c99版本、Dell G3电脑。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。标识符通常由字母和数字以及其它字符构成。c语言标识符...
    99+
    2022-11-28
    C语言 标识符 用户标识符
  • c#语言中变量包含哪几种类型各有什么特点
    c# 中支持的值类型包括整数、浮点、布尔、字符和枚举类型;引用类型包括类、接口、数组和字符串。值类型存储在栈上,复制时创建副本,而引用类型存储在堆上,复制时创建指向原始数据的另一个引用。...
    99+
    2024-04-04
    c#
  • c语言静态变量的特点有哪些
    C语言中的静态变量具有以下特点:1. 生命周期长:静态变量在程序运行期间始终存在,不会随着函数的调用而销毁。它们的值在函数调用之间保...
    99+
    2023-09-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作