精华内容
下载资源
问答
  • for循环中i变量初始化时报错

    千次阅读 2014-10-12 11:17:41
    for循环中i变量初始化时报错

    用的gcc版本号为:gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 

    写的程序源文件名为:643b.c,

    该文件中,有一个语句:for(int i=0;i<11;i++)

    运行编译命令:gcc -o 643b 643b.c

    会报错:

    643b.c: In function ‘main’:
    643b.c:5:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
      for(int i=0;i<11;i++)
      ^
    643b.c:5:2: note: use option -std=c99 or -std=gnu99 to compile your code

    需要在命令行中添加参数  -std=c99 或者 -std=gnu99

    gcc -o 643b 643b.c -std=c99

    运行程序:./643b

    得到结果:

    I am happy

    或者:

    gcc -o 643b 643b.c -std=gnu99

    运行程序:./643b

    得到结果:

    I am happy

    出错的原因可能是因为只有在标准的c99或者gnu99中,才能在for循环中初始化

    定义i的类型,所以需要加上参数:-std=c99 或者 -std=gnu99


    展开全文
  • 和j并初始化赋值0,结果不一样。 ``` <title></title> *{ padding:0; margin:0; font-size: 14px; list-style: none; } .wrap{ width:200px; margin: 10px auto; border: 1px solid #ccc;...
  • vc中for循环中多变量初始化的坑

    千次阅读 2017-06-19 16:08:47
    在vs2013的debug模式中,如果用这样来定义的话, int iSum = 0; for (int j=0,i = 0; j;j++,i++) { iSum += i; iSum += j;...而在变量监视中显示出来的值最是i=3。 那就奇怪了,为什么i=3,赋

    在vs2013的debug模式中,如果用这样来定义的话,

    int iSum = 0;
    			for (int j=0,i = 0; j<3&&i < 3;j++,i++)
    			{
    				iSum += i;
    				iSum += j;
    			}
    			int iTemp = i;

    那最后iTemp的值最终会变成2!

    而在变量监视中显示出来的值最是i=3。

    那就奇怪了,为什么i=3,赋值给iTemp,iTemp就变成了2呢?


    我们再对上面的代码做一点修改

    			int iSum = 0;
    			i = 0;
    			for (int j=0; j<3&&i < 3;j++,i++)
    			{
    				iSum += i;
    				iSum += j;
    			}
    			int iTemp = i;
    

    那最后iTemp的值就与i的值一样了。


    为什么会这样呢?具体原因我也不清楚,可能是编译器的bug?或者多余的变量不能放在for循环里进行初始化?


    最后我再重申一下,上面的测试是在debug模式中做的,Release没试过。有兴趣的同学可以自己用vs2013来试下





    展开全文
  • 全局变量,static变量初始化时间

    千次阅读 2019-04-24 22:04:41
    首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配...

    原文 https://www.cnblogs.com/novice-dxx/p/7094690.html

    本次上传主要是关于静态局部变量的初始化问题。

    首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的
    全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。
    根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):

    static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 const initialization,静态初始化在程序加载的过程中完成,对简单类型(内建类型,POD等)来说,从具体实现上看,zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。

    dynamic initialization:动态初始化主要是指需要经过函数调用才能完成的初始化,比如说:int a = foo(),或者是复杂类型(类)的初始化(需要调用构造函数)等。这些变量的初始化会在 main 函数执行前由运行时调用相应的代码从而得以进行(函数内的 static 变量除外)。

    在这里插入图片描述

    后面再来谈谈另一个问题,假如我们在一个循环中,定义了一个静态局部变量并进行初始化,循环过程中**,编译器怎么知道当前的静态局部变量已经初始化过了呢?**

    这个问题C和C++的处理方式也是不一样的。C中编译器会直接跳过这一个语句,因为在编译的时候已经对静态局部变量进行过分配空间并初始化,所以代码执行过程中根本不需要再次执行而在C++中,编译器会在编译器分配内存后,在全局区域(当前静态局部变量的地址)附近同样分配一块空间,进行记录变量是否已经进行过初始化。之所以说附近是根据编译器不同,处理方式不同导致的。在网上有博客介绍某种编译器(该吧主并没有透露编译器名字),会在当前变量后面的一个字节进行改变,具体上代码:

    展开全文
  • memset初始化详解+变量初始化最大值、最小值 计算机是使用二进制进行存储的,每一个二进制称为1位(bit),每8位称为1字节(Byte,B),1024字节称为1千字节(KB),1024千字节称为1兆字节(MB)。 换算关系: 1MB=1024KB 1KB...

    memset初始化详解+变量初始化最大值、最小值

    计算机是使用二进制进行存储的,每一个二进制称为1位(bit),每8位称为1字节(Byte,B),1024字节称为1千字节(KB),1024千字节称为1兆字节(MB)。
    换算关系:
    1MB=1024KB
    1KB=1024B
    1B=8bit
    int大小为4字节,double大小为8字节,long long 大小为8字节,char大小为1字节。

    memset

    memset是按照字节进行赋值,即对每一个字节赋相同值,可以对数组进行整体赋值。
    基本格式:
    memset(数组名,值,sizeof(数组名)); (C++需要头文件:cstring)

    数组整体赋值

    下面举两个例子,帮助大家理解。

    1. 数组每个字节赋值为1:
    int a[100];
    memset(a,1,sizeof(a));
    

    int大小为4字节,每个字节8位,共32位。将每一个字节赋值为1,二进制表示为:

    00000001 00000001 00000001 00000001

    所有a数组中每一个数的值为:20+ 28+ 216 + 224=16843009。

    1. 数组每个字节赋值为-1:
    int a[100];
    memset(a,-1,sizeof(a));
    

    负数的二进制在计算机中用补码形式存在,负数的补码为负数的绝对值的二进制取反后加1.
    如-5的二进制表示:
    5的二进制:0101
    5的反码:1010
    -5的补码:1010+1=1011
    -1的补码为11111111
    因此,数组元素二进制表示为:

    11111111 11111111 11111111 11111111

    现在将上面的二进制进行计算。第一位为符号位,表示负数。负数的二进制计算为减1,取反,结果为:

    00000000 00000000 00000000 00000001

    因此,负数的二进制计算出来为-1。
    所有,a数组中每一个元素的值为-1。

    同理,当按照字节赋值为0时:

    int a[100];
    memset(a,-1,sizeof(a));
    

    数组元素的值也为0。
    使用memset对数组赋值时,只有字节赋值为0和-1时,数组元素的值才和字节的值相等。

    常用的赋值:

    1. 如果是int数组:
      int类型范围:-2147483648~2147483647
      memset(a,127,sizeof(a)),全部初始化为int的较大值,即2139062143(int 最大值为2147483647);
      memset(a,0,sizeof(a)),全部初始化为0;
      memset(a,-1,sizeof(a)),全部初始化为-1;
      memset(a,128,sizeof(a)),全部初始化为一个很小的数,比int最小值略大,为-2139062144。
    2. 如果是double数组:
      double类似范围为:-1.7e+308~1.7e+308
      memset(a,127,sizeof(a)),全部初始化为一个很大的数1.38e+306;
      memset(a,0,sizeof(a)),全部初始化为清0;
      memset(a,128,sizeof(a)),全部初始化为一个很小的数-2.93e+306。

    以上都是常用的最大值,最小值赋值,其他赋值请不要轻易使用,为了验证是否初始化正确,可以初始化后输出其中的一个数进行查看。

    单个变量赋值

    有时候需要对单个变量赋值。

    1. 赋值最大值 :0x7fffffff 或 0x7FFFFFFF
      int是4字节。每个字节8位,总共32位。
      0x表示的是十六进制,十六进制7对应二进制0111,十六进制f对应二进制1111,共7个f,每两个数组成一个字节,最后组成的二进制就是:
    7f ff ff ff
    01111111 11111111 11111111 11111111

    刚好是int 的最大值,即2147483647。

    1. 赋值最小值:0x80000000
      int类型的最小值,最后转化为二进制就为1000…00,总共31个0,为-231=-2147483648。

    这种方式适合单个变量赋值,最大值,最小值比较的初始化。
    如果需要整体赋值,使用for循环一个一个赋值。需要整体赋值,使用memset。

    注意事项

    当赋值为较大值或者较小值时,进行加法、减法、乘法计算时会产生溢出。如:

    int a=0x7fffffff,b=0x7fffffff;
    a=a+b;
    

    或者:

    int a[100]
    memset(a,127,sizeof(a));
    a[5]=a[4]*a[3];
    

    赋值为最小值时,继续作减法,也会溢出。
    所有,当变量已经是很大的值或很小的值,如果继续进行加法、乘法,会超过类型的大小限制,造成溢出。
    因此当赋值较大值或较小值时,一定要注意是否会出现溢出的情况。
    为了防止这种情况发生,有如下方法:

    1. 可以将大小设为不大不小的中间值,如1000000,9999999等
      memset(a,127/3,sizeof(a)),全部初始化为707406378。
    2. 将int 改为long long、double,甚至使用高精度进行计算。
    展开全文
  • for循环初始化多个变量

    千次阅读 2020-08-02 09:05:56
    j++) 表示的写法:int j=1,s=0, 表示定义并初始化变量j 和s 这个s与 double sum =0,s; 中的s是两个变量。 这种写法跟我们平时定义两个同类型变量的写法是一个道理: int i =0,j=0; //i和j都是int变量。 另外,...
  • C语言各种变量初始化

    万次阅读 多人点赞 2018-10-07 23:19:00
    数值类变量初始化 整型、浮点型的变量可以在定义的同时进行初始化,一般都初始化为0。 int inum = 0; float fnum = 0.00f; double dnum = 0.00; 字符型变量初始化 字符型变量也可在定义的同时进行初始化...
  • 两起变量初始化问题的排查过程

    千次阅读 2014-09-24 16:24:09
    【文章摘要】 变量初始化看似很简单,但如果初始化位置不当或忘记初始化,则会导致程序行为异常。 本文基于作者的实际项目经验,对近期遇到的两起变量初始化问题进行了详细的分析,为相关软件问题的分析及解决提供...
  • tensorflow中常用的变量初始化方法

    千次阅读 2019-05-03 13:50:28
    1. 初始化为常量 tf.constant_initializer __init__( value=0, #指定的常量 dtype=tf.float32, #数据类型 verify_shape=False #是否可以调整tensor的形状,默认...#常量初始化 #tf.constant_initializer va...
  • javac 中的if-else变量初始化问题

    万次阅读 2018-09-27 17:22:56
    在前几篇文章中我们介绍过了AbstractAssignAnalyzer.visitIf(JCIf),该方法是用来判断在if语句中变量初始化情况的.例如如下代码: public void assgin(){ int c; int a = 0; if(c != 0){ } } 在IDE ...
  •  不要把static成员变量初始化操作安排在类的构造函数中,因为构造函数可能一  再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件中, 因为它可能被载入到许多地方,因此就可能执行许多次...
  • Go语言变量初始化方法 以下四种命名方法是等价的: s := “” var s string var s = “” var s string = “” 那么什么时候用哪种而不用哪种,为什么? 第一种形式最简洁,但只能用在函数内部,不能用在包变量。 ...
  • 在上一篇博客 Spring源码学习--Bean对象初始化(二)中我们介绍了Bean对象的初始化过程,接下来我们介绍一下对初始化后的Bean的变量初始化的操作流程。 对于Spring对属性值注入的方式,即使我们没有看Spring的...
  • 基本数据类型数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)下面是默认值:0/0/0/0/0.0/0.0/ /false首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定...而成员变量就是类的数...
  • int a; main() { ...我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看. while(1) {  st
  • 51单片机定时器中断函数中变量初始化的问题 #include<reg51.h>//调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char uint n=0; //查表变量 uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf...
  • package com.Test; import java.util.*; public class Test { public static void main(String[] args){ int[] a = {1,23,36,33,1,36,66}; reverse(a); for(int i = 0;i System.out.println(a[i]);
  • 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几...
  • 关于局部变量初始化

    千次阅读 2018-10-26 15:22:35
    我们经常被告知:在Java语言规定,局部变量必须要先初始化,然后才能使用。为什么呢? 首先 Java 语言就是这么规定的。其实无论成员变量还是局部变量都要初始化。只是JVM帮我们初始化了成员变量。 第一种解释: ...
  • 是的,可以把这些初始化放到for的上面,可是有时觉得如果是一次性的变量,我希望它可以是for的局部变量,以避免浪费一些最佳变量名(额,好吧,我承认我强词夺理了^^),或者能让代码更优雅点吧? 拜求解决方案。
  • c中for 循环里可以初始化变量

    千次阅读 2011-08-18 20:28:34
    经常 写成 for(int i = 0; i 在虚拟机下的linux平台下运行不能通过, 改成 int i ; for(i = 0; i    ok
  • 变量初始化时输出乱码的原因

    千次阅读 2016-03-19 08:31:10
    初学C语言时老师警告的一...今天我们就来看看未初始化变量里边是什么东西。  先看测试程序: #include int main(void) { int i; double d; printf("%d\n%lf\n", i, d); printf("%0X\n", i); printf("%0X\n
  • 非静态的变量 在实例化对象时初始化 陷入死循环 所以内存溢出 结合上一个例子看出,初始化块{ }和非静态变量是按顺序执行,当把ADemo instance=new ADemo();放到初始化块{}后面时 ,{}会执行然后遇到new之后再从上...
  • 实在知乎上看的答案,感觉很好,就转载一下,原文地址: 为什么全局变量无须初始化,局部变量必须初始化? https://www.zhihu.com/question/30516949Intopass回答一:首先 Java 语言就是这么规定的。然后为什么 ...
  • switch case中初始化变量问题

    千次阅读 2015-11-11 16:59:31
    在switch语句初始化变量的话记得一定要将此case语句加{。。。}!! 变量初始化可能被switch语句。除非把变量定义放在一个程序块里面,否则不能跳过带有初始化变量定义。(除非定义在一个程序块里,变量的作用域...
  • go语言的初始化顺序,包,变量,init
  • C++静态变量为何只能初始化一次

    千次阅读 2014-02-11 23:35:22
    static 关键字的作用: ...static全局变量是限定作用域的全局变量。  static函数只能被本文件里的内容使用(相当于私有函数),是限定作用域的全局函数。  C++里头的static函数是相对成员函数而言
  • down没有初始化,但是我明明在循环里面初始化了啊? 附上代码: ``` #include #include #include using namespace std; vector<int> ans; int n; const int INF = 0x3f3f3f; void solve(vector<int> dir,int f,...
  • 本小节任然讨论变量初始化问题,但出于重视,我们将其独立成小节。现在看两个测试案例。  案例1:建立Win32 Console Application工程,工程名:Test1,代码如表4.3。       ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,762
精华内容 193,104
关键字:

循环变量初始化