标题:能帮我,看看一个很简单的输出问题
只看楼主
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
结帖率:100%
已结贴  问题点数:20 回复次数:10 
能帮我,看看一个很简单的输出问题
程序代码:
#include<stdio.h>
#include<math.h>
void fun(int *a,int i,int j){
    int t;
    if(i<j){
        t=a[i];a[i]=a[j];a[j]=t;
        i++;j--;
        for(i=0;i<4;i++)
            printf("%2d",a[i]);
        fun(a,i,j);
    }
}
int main(){
    int x[]={2,6,1,8},i;
    fun(x,0,3);
    for(i=0;i<4;i++)
        printf("%2d",x[i]);
    printf("\n");
}

输出:【
 8 6 1 2 8 6 1 2

--------------------------------
Process exited after 0.04188 seconds with return value 0
请按任意键继续. . .

为什么这里只输出两次不应该是三次嘛,一次是i=0,j=3,i<j  成立;二次是i=1;j=2;i<j成立,并且“  8  6  1  2”应该变成了“  8  1  6  2”了呀
而且我把fun函数的for循环注释掉,就能输出“  8  1  6  2”,如果不注释掉就是上面输出的那种情况,
我把main函数的输出注释掉,只有一次输出,所以总结出来上面的输出应该是fun函数一次输出,main函数一次输出,所以fun函数还有一次输出为什么不执行,只有i<j的时候不执行啊
有人帮我看看这个题目嘛?(如果又是向上次那样是小细节问题没注意到,那真的不好意思)

[此贴子已经被作者于2023-4-4 12:56编辑过]

搜索更多相关主题的帖子: 函数 fun 输出 int main 
2023-04-04 12:55
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:20 
因为您乱用i作为循环变量,造成循环结束以后i=4
所以进入第二次fun以后if不成立了。

[此贴子已经被作者于2023-4-4 14:31编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-04-04 14:29
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 2楼 forever74
俺没有乱用哦,这是一个题目

专升本备考中!!!
2023-04-04 15:22
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 2楼 forever74
我懂了,谢谢!(其实我有考虑过这个问题的,但是当时认为for循环的i和外面的i不是同一个i)

专升本备考中!!!
2023-04-04 15:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
所以,这就是为什么C语言反对
    int i;
    for( i=0; ……
这种写法的原因了,但遗憾的是,只有等待顽固不化的老码农仙逝后才能河清海晏玉宇澄清
( 建议的写法是 for( int i=0; ……
( 同样,使用int而非size_t作下标或数组长度 亦为遗毒之一 )

说个泯灭了的历史:上世纪末建议使用「for( int i=0; ……」一开始的目的是为了拷贝粘贴方便,把i的定义放到十万八千里之外实在不利于代码的拷贝。但后来发现,避免变量污染才是此举最大的得利。
对这段历史的佐证是,一开始时「for( int i=0; ……」并没有强制规定i的作用域仅限于for之内,而是交由编译器「实现定义」。

程序代码:
#include <stdio.h>

#define std_size(arr) (sizeof(arr)/sizeof(*(arr)))

void std_swap( int* a, int* b )
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void std_reverse( int* first, int* last )
{
    while( first!=last && first!=--last )
        std_swap( first++, last );
}

int main( void )
{
    int x[] = { 2, 6, 1, 8 };

    std_reverse( x+0, x+std_size(x) );

    for( size_t i=0; i!=std_size(x); ++i )
        printf( "%d%c", x[i], " \n"[i+1==std_size(x)] );
}
2023-04-04 15:38
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 5楼 rjsp
我可能有点疑惑了,我们学习的C语言和您所说的C语言是一个C语言吗?不知道您有没有听说过谭浩强的C语言呢,我学的就是他的书,包括您第一次回答我帖子的“%zu”和这次所提到的“size_t”在书中都没有提及。准确来说,如果不是因为您,我都不知道。而且不得不说一句您会过时的C语言,还有根据时代不断变化的C语言,不回混为一谈,真的很厉害!

专升本备考中!!!
2023-04-04 18:12
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
应该区分学术性学习和实用性学习。
学术性学习讲究与时俱进,接受最新的观念是追随以至于超越前沿的必要前提。
实用性学习要考虑实际应用时的兼容性问题,工业(大厂)开发环境中为了稳定或其它理由往往有各自的规定,而不追求使用最新的版本。在这样的需求下,老实说,坚持像我一样使用ANSI C标准反而可以在更多不同的环境里比较省心。
One world one dream, but different road.

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-04-04 22:02
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 7楼 forever74
ok,谢谢您的回答

专升本备考中!!!
2023-04-05 13:17
cheetah
Rank: 2
等 级:论坛游民
威 望:2
帖 子:110
专家分:92
注 册:2013-6-29
得分:0 
以下是引用编程小猪在2023-4-4 18:12:05的发言:

我可能有点疑惑了,我们学习的C语言和您所说的C语言是一个C语言吗?不知道您有没有听说过谭浩强的C语言呢,我学的就是他的书,包括您第一次回答我帖子的“%zu”和这次所提到的“size_t”在书中都没有提及。准确来说,如果不是因为您,我都不知道。而且不得不说一句您会过时的C语言,还有根据时代不断变化的C语言,不回混为一谈,真的很厉害!

谭老的书确实也不错,但上面的东西实在太少太少了,只是一些最最基础的东西.

天道酬勤
2023-04-07 13:57
cheetah
Rank: 2
等 级:论坛游民
威 望:2
帖 子:110
专家分:92
注 册:2013-6-29
得分:0 
以下是引用rjsp在2023-4-4 15:38:21的发言:

所以,这就是为什么C语言反对
    int i;
    for( i=0; ……
这种写法的原因了,但遗憾的是,只有等待顽固不化的老码农仙逝后才能河清海晏玉宇澄清
( 建议的写法是 for( int i=0; …… )
( 同样,使用int而非size_t作下标或数组长度 亦为遗毒之一 )

说个泯灭了的历史:上世纪末建议使用「for( int i=0; ……」一开始的目的是为了拷贝粘贴方便,把i的定义放到十万八千里之外实在不利于代码的拷贝。但后来发现,避免变量污染才是此举最大的得利。
对这段历史的佐证是,一开始时「for( int i=0; ……」并没有强制规定i的作用域仅限于for之内,而是交由编译器「实现定义」。

我其实也挺喜欢for(int i....)这种写法,但有时候需用到数组或其它什么结束状态的时候不得不把i分离出来,您有什么更好的方法吗?

天道酬勤
2023-04-07 14:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511785-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.105134 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved