据我所知,在C语言中,如果一个循环有方括号,那么它就有作用域,对吗?我在GCC中try 了一些代码,情况似乎就是这样,例如:

for(unsigned char i=0;...;...){
   unsigned char j=0;
}
//Outside of the for scope:
unsigned char j=0;

在这里我们完全没有问题,但是,循环参数中的变量又如何呢?

例如,GBD C编译器中的以下代码(在线):

switch(Maneral){
      case 1:
         for(unsigned char i=0x0A;i<=0x64;i=i+0x0A){
            indice++;
         }
      break;
      
      case 2:
         for(unsigned char i=0x0A;i<=0x64;i=i+0x0A){
            indice++;
         }
      break;
   }

没有给出错误,我认为它不会给出错误,因为在for‘Share’各自的for的括号的范围内的参数中初始化的变量

至少到今天为止,这是我的头等大事,因为我使用CCS C编译器为MCU编写了一些嵌入式代码;这个编译器说具有‘97%的ANSI C兼容性’,在这个编译器中,下一段代码:

switch(Maneral){
      case M_CONICO:
         for(unsigned char i=0x0A;i<=0x64;i=i+0x0A){ unsigned char too=0;
            ActualizaValor(i,DataConico[index]);
            index++;
         }
      break;
      
      case M_CHICO:
         for(unsigned char i=0x0A;i<=0x64;i=i+0x0A){ //LINE 'X'
            ActualizaValor(i,DataChico[index]);
            index++;
         }
      break;
   }

在‘X’行给出一个错误,它显示为Identifier is already used in this scope,例如,如果我将第二个for循环中的"i"改为‘j’,它不会给出错误,并且对于在括号内声明/定义的变量(而不是在循环的参数中),它没有问题(CCC编译器)

那么,在像‘for()’这样的循环参数中初始化的变量的作用域是类似于实现定义的行为/未定义的行为,还是它是97% ANSI C Compatibility

提前谢谢!

编辑:我知道我只能在交换机之外声明/定义‘I’,但我想要了解这一点,因为我以为我对我知道的事情很有把握

推荐答案

从C99开始,在for循环的init-子句中声明的变量的作用域是整个循环,其生命周期在循环完成时结束,因此for循环的大致行为就像它周围有一组额外的隐含花括号一样,例如:

for(unsigned char i=0;...;...){
   unsigned char j=0;
}

的行为就像您键入:

{
   unsigned char i=0;
   for(;...;...){
       unsigned char j=0;
   }
}

但这是C99(和更高版本)的特性,声称"ANSI C兼容性"的东西可能指的是C89/C90标准,当时for个循环的这个特性不是该标准的一部分.事实上,CCS编译器正在使用这个定义,as its compliance matrix是根据ANS/ISO 9899-1990定义的,其中ANSI ISO/IEC 9899-1990标准是C90标准的长正式名称.

C++相关问答推荐

来自stdarg.h的c中的va_args无法正常工作<>

从组播组地址了解收到的数据包长度

我无法让LLDB正确运行我的可执行文件

LibpCap禁用监视器模式(C、MacOS)

非正规化边缘毛刺

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

从uint8_t*转换为char*可接受

tick.q中的Kdb+键控表语法

在C语言中,指针指向一个数组

为什么这个分配做得不好呢?

Zlib:解压缩大文件导致";无效代码长度设置";错误

从BIOS(8086)中读取刻度需要多少?

我可以创建适用于不同endian的 colored颜色 struct 吗?

赋值两侧的后置增量,字符指针

无算术运算符和循环的二进制乘法

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

C: NULL>;NULL总是false?

如何用用户输入的多个字符串填充数组?

当循环变量在溢出时未定义时,可以进行哪些优化?

c 函数指针,另一种语法