随看随点赞,养成好习惯 2022-06-25 13:44 采纳率: 61.5%
浏览 36
已结题

int变量初始化的影响

#include<stdio.h>
int main(void)
{
int la,lb,lc;
char ch;
//la=lb=lc=0;
while((ch=getchar())!='#')
{
if(ch==' '){la++;}
else if(ch=='\n'){lb++;}
else{lc++;}
}
printf("空格有%d 换行符有%d 其他有%d",la,lb,lc);
}
这是源码,问题点出现在注释行。以只输入#为例。
没有注释行,输出结果为0 1 0
有注释行,输出结果为0 0 0

img

img

把lb和la lc任意一个换位置,倒霉的还是lb

img


img

去掉一个,改成其中一个两次,倒霉就变成了以lc为最高优先级,有lc就倒霉lc,其次再看lb。

img


img

a a b 010 a a c 001(有c)
b b a 010 b b c 001(有c)
c c a 001(有c) c c b 001(有c)
a b b 010 c b b 001(有c)
a c c 001(有c) b c c 001(有c)
b a a 010 c a a 001(有c)
a b a 010 a c a 001(有c)
b a b 010 b c b 001(有c)
c a a 001(有c) c b c 001(有c)

如果是三个一样的,就不会发生任何倒霉改变事件。
这很疑问,这是放在三个不同的条件判断里,按理说必须要满足相对应条件才会进去,但是为什么会出现有c就是c倒霉的情况。

  • 写回答

1条回答 默认 最新

  • a5156520 2022-07-06 11:33
    关注

    是这样的,代码的逻辑应该是当输入的字符不是'#'字符时,才进行判断,如果只输入'#'字符,则没有进入while循环的循环体,所以在输入'#'字符前需要输入其他字符,才能进行判断,'#'字符是不在统计范围内的,代码是没问题的。
    如果去掉la=lb=lc的赋值,最后打印的应该是变量la,lb,lc内存空间原来的数值,而不是进行判断的数值。
    进行的测试如下:

    #include  <stdio.h>
    
    int main(void){
        
        int la,lb,lc;
        char ch;
        
        la=lb=lc;
        while((ch=getchar())!='#'){
            if(ch==' '){
                la++;
            }else if(ch=='\n'){
                lb++;
            }else{
                lc++;
            } 
            
        }
        
        printf("空格有%d  换行有%d   其他有%d",la,lb,lc);
        
        return 0;
    } 
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 修改了问题 6月25日
  • 创建了问题 6月25日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画