C语言可以在执行语句中间定义变量吗?

例如:for(int i=0; i<5; i++){

                                                                                                                         }

在C++中(.CPP文件是按C++标准编译的),按照语法我们可以把变量定义在任何位置,只要在用到变量前对该变量进行声明定义就行了,位置不做特别要求,比如函数中任意位置出现的For循环中:



好多同学分不太清C和C++的区别,加上使用VC++等时源代码文件默认也是.cpp的,很多同学平时懒得改成.c后缀名,觉得运行时候也都一样没啥区别,所以很容易弄混。

那在C语言里面有什么要求?

一般老师会讲:

在C语言里,变量只能在函数的开头处声明和定义。

在函数里要用到的变量必须要在开头处声明定义。

声明定义的前面不能有任何其他非声明定义的语句。

全局变量在函数体的外部声明定义。

C语言老的标准的规定了在一个模块里(函数、循环体等)先声明一切所需变量后才能进行相关操作的规定。

全局变量,可以在函数外任何位置定义。

局部变量的合法定义位置,依赖于编译器遵循的C规范版本。

接下来,我们参照具体例子详细看一下:

1、仅支持C89规范的编译器,只支持在作用域起始部分定义变量。比如:



如果写成



2、支持C99或者部分支持C99的编译器:

局部变量可以定义在任何位置。

之前的第二个例子中的定义方式,在这种编译器下是合法的。

甚至部分支持C99全面的编译器,支持在for中定义变量。



3、目前大多数编译器,均支持任何位置定义变量,但仅有少部分支持for中定义变量,所以在编码时,不建议for中定义,会降低可移植性。

简单的说如果大家使用较老的编译器比如VC++6.0时遇到下面的代码会提示错误,因为较老的编译器要求.c文件中的局部变量定义必须放在所有执行语句前,块开头处。



上面的程序如果在较老的编译器下使用.c文件保存并编译的时候会出错,注意,i、j的定义是没有任何问题的,因为它们都处于局部块的开始处。但是k和m的定义就会有问题,因为它们前面有可执行语句,所以m和k应该定义在i的前后。我当时使用VS2008的时候会报错,但是现在使用VS2013编译上面程序时不会有任何问题,所以,这个使用方法到底对不对,还是要看大家的编译器,C99以后基本都使用变量就近定义的方式,因为这样十分清晰。

变量在函数开头定义:便于修改

变量就近定义:便于阅读

变量在块语句的开头定义:有的临时变量放在语句块开头,可以不用在函数开头定义,并且在使用完毕后释放空间,可以这么做,但不要无故添加花括号来提高代码的结构。

总之,为了移植性更强一些,建议大家编写C语言的时候尽量将局部变量都定义在可执行语句前,块的开始处,这样不管是新的编译器或者老的编译器都可以正常编译。不过,随着变量定义就近原则的方便性的体现,可能使用变量就近定义会更好一些,至于如何抉择,大家可以根据项目需求和实际的情况而定。

C语言可以在执行语句中间定义变量吗?的更多相关文章

  1. T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)

    T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b  nvarchar(10) ; 2.赋值: 法1:set @变量名 ...

  2. C 语言中的 switch 语句 case 后面是否需要加大括号

    事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...

  3. for语句中声明变量

    在C语言中,局部变量应该在函数的可执行语句之前定义,但在C++中变量可在任何语句位置定义,只要允许程序语句的地方,都允许定义变量. 在C99标准中C同C++一样允许在for循环语句中定义变量.并且这个 ...

  4. ansible中定义变量的若干方法

    Ansible支持十几种定义变量的方式 根据优先级排序的定义方式: Inventory变量 Host Facts变量 Playbook变量 Playbook提示变量 变量文件 命令行变量 1.Inve ...

  5. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?

    报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...

  6. C语言中嵌入式SQL语句

    原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Serve ...

  7. 单片机c语言教程:C51循环语句

    单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...

  8. x86汇编反编译到c语言之——(2)if语句

    一. 测试的C语句及编译后的x86汇编代码 int a; int b; int main(void) { int c; if (c) a = 4; else b = 5; return 0; } 1 ...

  9. Oracle基础 各种语句的定义格式

    Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...

随机推荐

  1. labelimg使用指南

    labelimg使用指南 From RSMX - https://www.cnblogs.com/rsmx/ 目录 labelimg使用指南 1. 确保已经安装了 Python 环境 2. 使用pip ...

  2. sql-关键词的大小写与注释

    是否区分大小写 和 注释 大小写 oracle 自带的sqlplus: mysql 客户端 : Navicat: 注释 oracle 自带的sqlplus: mysql 客户端 : 小节 oracle ...

  3. bat-winget-win平台的软件包管理器

    win10 1709版本以后 引入的包管理器,如果不可用 需要 更新一下 应用安装程序. winget命令的功能  常用的就  安装 卸载 更新  . 卸载 使用中如果提示 策略 不允许,可执行下面命 ...

  4. jQuery获取市、区县、乡镇、村

    效果图: 首先根据自己方法把地区树状结构json字符串拿到 html下拉框和js写法如下: <select class="form-control" style=" ...

  5. input标签的事件之oninput事件

    最近在写前端的时候,用到了oninput事件.(其中也涉及了onclick) 问题:鼠标点击数字和运算符的时候,文本框里的内容到达一定长度时,会出现无法继续往后面跟随光标的问题. 解决:见下面代码 这 ...

  6. JS中通过Input中id获取输入框中的值

    HTML中 <input type="text" id="ONE" oninput="kpi()"> JS中 function ...

  7. 没想到吧,Spring中还有一招集合注入的写法

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了.bean的注入相信大家都比较熟 ...

  8. 【跟着大佬学JavaScript】之lodash防抖节流合并

    前言 前面已经对防抖和节流有了介绍,这篇主要看lodash是如何将防抖和节流合并成一个函数的. 初衷是深入lodash,学习它内部的好代码并应用,同时也加深节流防抖的理解.这里会先从防抖开始一步步往后 ...

  9. XJSON 是如何实现四则运算的?

    前言 在上一篇中介绍了 xjson 的功能特性以及使用查询语法快速方便的获取 JSON 中的值. 同时这次也更新了一个版本,主要是两个升级: 对转义字符的支持. 性能优化,大约提升了30%️. 转义字 ...

  10. docker安装Nessus

    Nessus家庭版最大只支持扫描16个主机,但利用docker无限使用,当然虚拟机快照也可以. 关于网上其他的破解版,我是没有成功(显示成功了,其实是自慰版),所以才弄得这个镜像 提供两个镜像(不懂d ...