为啥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 <stdio.h>
会这样做 — 而不是调用它来关闭文件。
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】:
---->
在IF-ELSE
语句中,分配内存而不是声明数组。
-
char *arr
malloc((sizeof(char)*30/60/106)
【讨论】:
【参考方案4】:您在块代码 中声明了您的数组。不管这个block是否在if语句中,都只能在这个block中访问这个数组。
如果要动态更改数组的大小,请在函数开头声明一个指针,然后为它动态分配内存(例如,使用 malloc)。但是,在您的情况下,您似乎可以在数组上声明并为其提供您需要的最大大小。
【讨论】:
以上是关于为啥JAVA源码中if else大都省略else,怎样的条件能够省去else?的主要内容,如果未能解决你的问题,请参考以下文章
Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?