为啥JAVA源码中if else大都省略else,怎样的条件能够省去else?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥JAVA源码中if else大都省略else,怎样的条件能够省去else?相关的知识,希望对你有一定的参考价值。

if (条件)
else
也不是都可以省略的,当条件成立,就运行if后面的语句,只有当条件不成立时,才运行else后面的语句。因此,大都省略else这得看你的程序的条件是指是什么情况。
参考技术A if 代码执行完就结束 比如 break return ....

为啥我不能在 IF-Else 中声明 char 数组?

【中文标题】为啥我不能在 IF-Else 中声明 char 数组?【英文标题】:Why Can't I declare char array in IF-Else?为什么我不能在 IF-Else 中声明 char 数组? 【发布时间】:2014-02-17 02:33:26 【问题描述】:

我试图根据文件中的行数在 if-else 中给出 Char 数组的大小。但是当我之后尝试使用它时,它会给出错误:“array undeclared”

FILE *f=fopen("G:\\workspaceC\\small1.txt","r");

while((c=fgetc(f))!=EOF)

    if(c=='\n')
        no_of_lines++;

printf("no_of_lines:  %d",no_of_lines);
int fclose(FILE *f);

if(no_of_lines<10)
    char b[30];

else if(no_of_lines>10 && no_of_lines<15)
    char b[60];

else
    char b[106];


 for(z=0;z<size;z++)
    
        if(c==b[z])  ///////Here it gives error: "b undeclared"
        
            flag=1;
            break;
        
    

【问题讨论】:

你可以——你展示了如何。问题是数组的范围是你声明它的块。而且您无法访问这些块之外的变量。另外,请注意,您声明了 fclose() — 而且您不需要这样做,因为 #include &lt;stdio.h&gt; 会这样做 — 而不是调用它来关闭文件。 int fclose(FILE *f); --> fclose(f); 顺便说一下,你计算行数,然后根据行数分配更多或更少的字节,而不是行的长度。你可能需要仔细考虑你在做什么。 【参考方案1】:

您已在 if 块中声明了数组 b。所以,它只对if 块可见。而且,它在if 块之外是不可见的。

如果你改变代码如下,你会达到你想要的。

int size;
if(no_of_lines<10)
    size = 30;

else if(no_of_lines>10 && no_of_lines<15)
    size = 60;

else
    size = 106;

char b[size];

【讨论】:

效果很好。错过了这个逻辑:) 非常感谢 @user3213918 这是一个非常糟糕的解决方案!根据标准它不应该工作(是的,我知道它实际上在 gcc 中工作,但这并不意味着它会在每个环境中工作)。数组必须用常量(值或常量变量)初始化!【参考方案2】:

if 块内声明的数组将成为该块内的本地数组。在技​​术方面,它的范围仅限于 if 块。这就是你得到错误的原因。将声明移到块外。

还有更多的问题:

    您先读取整个文件以确定行数,然后丢弃您读取的所有数据。 您在哪里初始化数组内容?因此,您最终会遇到问题。

因此更好的办法是先使用file API找到文件大小,为其动态分配空间,将内容读入动态分配的空间并适当处理数据。

【讨论】:

除此之外,OP 可能需要 VLA、动态分配,或者更好——只需声明最大可能大小的数组。 106 字节不算什么。 那么我将如何分配尺寸? @user3213918:何必呢?你的机器有多少内存?我敢打赌,超过一兆字节(可能是 4-16 GiB)。因此,为b 分配 4096 字节确实不会对您的机器造成太大负担。不要担心这些愚蠢的事情。如果一定要担心,那就有条件地选择一个大小(int size;),那么int b[size];就是一个VLA——变长数组。当然,这假设您的编译器不超过 15 年过时(C99 需要 VLA 支持)。如果您被困在 25 年的时间扭曲 (C89) 中,那么您没有 VLA,您需要改用 malloc()free() @JonathanLeffler:还是 alloca?【参考方案3】:

----&gt;IF-ELSE 语句中,分配内存而不是声明数组。

    char *arr malloc((sizeof(char)*30/60/106)

【讨论】:

【参考方案4】:

您在块代码 中声明了您的数组。不管这个block是否在if语句中,都只能在这个block中访问这个数组。

如果要动态更改数组的大小,请在函数开头声明一个指针,然后为它动态分配内存(例如,使用 malloc)。但是,在您的情况下,您似乎可以在数组上声明并为其提供您需要的最大大小。

【讨论】:

以上是关于为啥JAVA源码中if else大都省略else,怎样的条件能够省去else?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础重点

使用 if-else 速记时省略第二个表达式

Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?

Java 循环

编写 if-else 编译器时会抱怨,但简而言之却没有,为啥? [复制]

刘强1109 JavaScript基础二(分支与循环结构)