stevenmtroy 发表于 2017-10-23 13:09:46

二维数组的输出

本帖最后由 stevenmtroy 于 2017-10-23 13:27 编辑

请问一下,有哪位知道为什么下面这段代码初始化并输出后的结果是这样
12   3   0
0   0   00
0   0   0   0
而不是对角矩阵
1000
020   0
0   030

        int a = { a = 1,a = 2,a = 3 };
        for (int k = 0; i <= 2; ++i)
        {
                for (int j = 0; j <= 3; ++j)
                {
                        printf("%d ", a);
                }
                printf("\n");
        }
        return 0;

丶忘却的年少o 发表于 2017-10-23 13:17:40

请看链接的第5点
http://bbs.fishc.com/forum.php?mod=viewthread&tid=70878&extra=page%3D1%26filter%3Dtypeid%26typeid%3D584

stevenmtroy 发表于 2017-10-23 13:30:20

丶忘却的年少o 发表于 2017-10-23 13:17
请看链接的第5点
http://bbs.fishc.com/forum.php?mod=viewthread&tid=70878&extra=page%3D1%26filter%3Dt ...

直接这样写a【3】【4】= {【0】【0】=1,【1】【1】=2,【2】【2】=4},编译器会报错

丶忘却的年少o 发表于 2017-10-23 13:37:44

是的,因为是C99标准的,看编译器支不支持了,LINUX里写加上-C99就可以,别的编译器会报错,可能没更新标准吧。要是你非要这么写就分步吧,
int a = {0};       // 初始化
a = 1;
a = 2;
a = 3;

stevenmtroy 发表于 2017-10-23 13:43:14

本帖最后由 stevenmtroy 于 2017-10-23 13:50 编辑

丶忘却的年少o 发表于 2017-10-23 13:37
是的,因为是C99标准的,看编译器支不支持了,LINUX里写加上-C99就可以,别的编译器会报错,可能没更新标准 ...

按照这写法a【3】【4】={a【0】【0】=1,a【1】【1】=2,a【2】【2】=3},vc的编译器可以编译,但是输出结果不正确,本来2应该赋值给a【1】【1】的,但是实际上却赋值给了a【0】【1】,3本来应该赋值给a【2】【2】,但实际上却赋值给了a【0】【2】,这让人感到有些费解

丶忘却的年少o 发表于 2017-10-23 13:51:11

stevenmtroy 发表于 2017-10-23 13:43
按照这写法a【3】【4】={a【0】【0】=1,a【1】【1】=2,a【2】【2】=3},vc的编译器可以编译,但是输出 ...

编译的时候把不能执行的会忽略的,应该变成了 a = {1,2,3},就是前3个有,后面的都是0。

stevenmtroy 发表于 2017-10-23 13:58:14

丶忘却的年少o 发表于 2017-10-23 13:51
编译的时候把不能执行的会忽略的,应该变成了 a = {1,2,3},就是前3个有,后面的都是0。

原来如此,谢谢了

丶忘却的年少o 发表于 2017-10-23 13:59:17

stevenmtroy 发表于 2017-10-23 13:58
原来如此,谢谢了

不用客气

stevenmtroy 发表于 2017-10-23 16:14:03

丶忘却的年少o 发表于 2017-10-23 13:59
不用客气

另外,我还有一个问题忘记问了,就是如果把上面那段代码调用反汇编功能可以发现:
1被赋值给了数组的起始地址a加上偏移量0的内存单元,也就是a【0】【0】的起始位置位置,2被赋值到了a加上偏移量20的内存单元,也就是a【2】【2】的起始位置位置,3被赋值到了a加上偏移量40的内存单元,也就是a【3】【3】的起始位置,也就是说从反汇编的结果上来看,那样写是可以实现输出对角矩阵的功能的,但实际执行结果缤纷如此,难道vs里面的反汇编功能翻译出的汇编代码还不是编译器的最后编译结果吗?
int a = { a = 1,a = 2,a = 3 };
00F61808mov         eax,10h
00F6180Dimul      ecx,eax,0
00F61810lea         edx,a
00F61814mov         eax,4
00F61819imul      ecx,eax,0
00F6181Cmov         dword ptr ,1
00F61823mov         dword ptr ,1
00F6182Amov         eax,10h
00F6182Fshl         eax,0
00F61832lea         ecx,a
00F61836mov         edx,4
00F6183Bshl         edx,0
00F6183Emov         dword ptr ,2
00F61845mov         dword ptr ,2
00F6184Cmov         eax,10h
00F61851shl         eax,1
00F61853lea         ecx,a
00F61857mov         edx,4
00F6185Cshl         edx,1
00F6185Emov         dword ptr ,3
00F61865mov         dword ptr ,3

丶忘却的年少o 发表于 2017-10-23 19:38:10

stevenmtroy 发表于 2017-10-23 16:14
另外,我还有一个问题忘记问了,就是如果把上面那段代码调用反汇编功能可以发现:
1被赋值给了数组的起 ...

嗯,的确是可以的,那就是说你的编译器是支持C99的。那是什么原因我就不清楚了,可能是编译器有什么选项要勾选或者什么的吧,下面是VC++6.0不支持C99的反汇编。

stevenmtroy 发表于 2017-10-23 20:27:21

丶忘却的年少o 发表于 2017-10-23 19:38
嗯,的确是可以的,那就是说你的编译器是支持C99的。那是什么原因我就不清楚了,可能是编译器有什么选项 ...

嗯,感谢您这么认真地看了,这个vs 2017版感觉还没用顺,好多功能都不熟悉,而且感觉编译器的编译原则和vc++6.0有些不一样,而且里面的诸如scanf_s(),strcat_s()也挺蛋疼的,很容易弄错

丶忘却的年少o 发表于 2017-10-23 20:36:31

stevenmtroy 发表于 2017-10-23 20:27
嗯,感谢您这么认真地看了,这个vs 2017版感觉还没用顺,好多功能都不熟悉,而且感觉编译器的编译原则和v ...

不用客气,我就是这样的一个人。不过我也挺抱歉的,百度了很久,都没这方面的解答,我只能按照我的编译器和理解来给你解释下。不过我是觉得不用去纠结一种方法,毕竟新标准很少用,而且通用性不高。
新的编译器会有很多的新标准和规则,的确会引发编程写法上的不一,但是语法是没问题的。至于你说的_s后缀可以看下这个:https://baike.so.com/doc/3719211-3908076.html

stevenmtroy 发表于 2017-10-23 20:54:38

丶忘却的年少o 发表于 2017-10-23 20:36
不用客气,我就是这样的一个人。不过我也挺抱歉的,百度了很久,都没这方面的解答,我只能按照我的编译器 ...

好的,非常感谢您,点100个赞
页: [1]
查看完整版本: 二维数组的输出