C语言可以在执行语句中间定义变量吗?
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语言可以在执行语句中间定义变量吗?的更多相关文章
- T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)
T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b nvarchar(10) ; 2.赋值: 法1:set @变量名 ...
- C 语言中的 switch 语句 case 后面是否需要加大括号
事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...
- for语句中声明变量
在C语言中,局部变量应该在函数的可执行语句之前定义,但在C++中变量可在任何语句位置定义,只要允许程序语句的地方,都允许定义变量. 在C99标准中C同C++一样允许在for循环语句中定义变量.并且这个 ...
- ansible中定义变量的若干方法
Ansible支持十几种定义变量的方式 根据优先级排序的定义方式: Inventory变量 Host Facts变量 Playbook变量 Playbook提示变量 变量文件 命令行变量 1.Inve ...
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...
- C语言中嵌入式SQL语句
原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Serve ...
- 单片机c语言教程:C51循环语句
单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...
- 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 ...
- Oracle基础 各种语句的定义格式
Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...
随机推荐
- HDFS数据平衡
一.datanode之间的数据平衡 1.1.介绍 Hadoop 分布式文件系统(Hadoop Distributed FilSystem),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件 ...
- springboot2+jpa+oracle实例
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...
- 服务器宕机了,Kafka 消息会丢失吗?
大家好,我是树哥. 消息队列可谓是高并发下的必备中间件了,而 Kafka 作为其中的佼佼者,经常被我们使用到各种各样的场景下.随着 Kafka 而来得,还有三个问题:消息丢失.消息重复.消息顺序.今天 ...
- 数据类型 简单扩展(Java)
public class HelloWorld { public static void main(String[] args) { //整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x i ...
- CF1703C Cypher 题解
题意:模拟一个 \(n\) 位密码锁. 做法:直接模拟,注意往后推,即若为 \(U\) 变为 \(D\),若为 \(D\) 变为 \(U\).注意 \(0\) 和 \(9\) 进行操作时的特判. #i ...
- Running Median_via牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1002 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K, ...
- TCP协议调试工具TcpEngine V1.3.0使用教程
简介 这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等. T ...
- Stream流的特点_只能使用一次和Stream流中的常用方法_map
Stream流的特点_只能使用一次 public class FilterStudy04 { public static void main(String[] args) { //创建一个Stream ...
- Python 元类详解
一.Type介绍 在Python中一切皆对象,类它也是对象,而元类其实就是用来创建类的对象(由于一切皆对象,所以元类其实也是一个对象). 先来看这几个例子: 例1: In [1]: type(12) ...
- React报错之Cannot find name
正文从这开始~ .tsx扩展名 为了在React TypeScript中解决Cannot find name报错,我们需要在使用JSX文件时使用.tsx扩展名,在你的tsconfig.json文件中把 ...