Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:根据变量的值,在for语句中使用不同的条件_C_For Loop_If Statement_Conditional Statements - Fatal编程技术网

C:根据变量的值,在for语句中使用不同的条件

C:根据变量的值,在for语句中使用不同的条件,c,for-loop,if-statement,conditional-statements,C,For Loop,If Statement,Conditional Statements,所以我想实现一个for语句,它的“长度”和条件取决于我给它的entries变量的值。循环主要读取文件 例如,如果条目数的命令行输入为正整数,我希望循环运行条目数迭代或直到到达文件末尾;如果条目数的输入为-1,我希望循环一直运行到文件结束 有没有一种方法可以做到这一点,而不必写两次for循环,每次都嵌套在if语句中;有没有更简洁的方法?询问,因为for循环中的语句是相同的;唯一的区别是for参数中的条件 以下是我知道我能做的: if ( number_of_entries > 0 ) {

所以我想实现一个for语句,它的“长度”和条件取决于我给它的entries变量的值。循环主要读取文件

例如,如果条目数的命令行输入为正整数,我希望循环运行条目数迭代或直到到达文件末尾;如果条目数的输入为-1,我希望循环一直运行到文件结束

有没有一种方法可以做到这一点,而不必写两次for循环,每次都嵌套在if语句中;有没有更简洁的方法?询问,因为for循环中的语句是相同的;唯一的区别是for参数中的条件

以下是我知道我能做的:

if ( number_of_entries > 0 ) {
    for ( i = 0; i < number_of_entries; i++ ){
        // set of for statements
        // check to see if end of file is reached
        // this case stops when i reaches number_of_entries or EOF
    }
}

else if ( number_of_entries < 0 ) {
    for ( i = 0; i > number_of_entries; i++ ){
        // identical set of for statements
        // check to see if end of file is reached
        // this case stops at EOF because i will never reach number_of_entries
    }
}
if(条目数>0){
对于(i=0;i<条目数;i++){
//语句集
//检查是否已到达文件末尾
//当我达到\u条目的数量或EOF时,此情况停止
}
}
else if(条目数<0){
对于(i=0;i>u条目的数量;i++){
//相同的for语句集
//检查是否已到达文件末尾
//这个案例在EOF时停止,因为我永远不会达到\u条目的数量
}
}
只是想知道我是否可以这样做,同时只保留一组for语句;因为两种情况下都是一样的


编辑:让我澄清一下第二种情况下的i++:它仍然应该是i++;第二个循环仅在到达文件末尾时结束。在那之前我会继续增加。输入条目数的唯一可接受输入为-1或任何正整数(程序中对此进行了检查)。

使用短路如何,因此只有当输入条目数为正时才测试
i

for ( i = 0; number_of_entries < 0 || i < number_of_entries; i++ ){
        // set of for statements
        // check to see if end of file is reached
    }
for(i=0;条目数<0 | | i<条目数;i++){
//语句集
//检查是否已到达文件末尾
}
如果
number\u of_entries
为负数,则
for
循环是一个无限循环(在检测文件结尾时,您必须在内部使用
break


因此,如果
条目的数量
为正,则每次都需要进行额外的测试,但考虑到循环(文件读取)的内容,性能应该不会受到太大影响。简洁与原始速度。

使用短路如何,因此只有当
条目数
为正时,才会测试
i

for ( i = 0; number_of_entries < 0 || i < number_of_entries; i++ ){
        // set of for statements
        // check to see if end of file is reached
    }
for(i=0;条目数<0 | | i<条目数;i++){
//语句集
//检查是否已到达文件末尾
}
如果
number\u of_entries
为负数,则
for
循环是一个无限循环(在检测文件结尾时,您必须在内部使用
break


因此,如果
条目的数量
为正,则每次都需要进行额外的测试,但考虑到循环(文件读取)的内容,性能应该不会受到太大影响。简洁与原始速度。

接受你在第二段代码中有一个输入错误:你的意思是
i--
,这样就可以了:

for (
    i = 0;
    i < abs(number_of_entries);
    i += (number_of_entries > 0) - (number_of_entries < 0)
)
用于(
i=0;
i0)-(条目数<0)
)
(条目数>0)-(条目数<0)
是C语言中测试数字符号的惯用方法


参考资料:

如果您的第二个代码段中有输入错误:您的意思是
i--
,这样就可以了:

for (
    i = 0;
    i < abs(number_of_entries);
    i += (number_of_entries > 0) - (number_of_entries < 0)
)
用于(
i=0;
i0)-(条目数<0)
)
(条目数>0)-(条目数<0)
是C语言中测试数字符号的惯用方法


参考资料:

如果您发现
number\u of\u entries
为负值,您可以将其重置为非常大的值,如
INT\u MAX
,使其继续运行,直到达到EOF

if (number_of_entries < 0) {
    number_of_entries = INT_MAX;
}
for ( i = 0; i < number_of_entries; i++ ){
    // set of for statements
    // check to see if end of file is reached
}
if(条目数<0){
_条目数=INT_MAX;
}
对于(i=0;i<条目数;i++){
//语句集
//检查是否已到达文件末尾
}

如果您发现
number\u of\u entries
为负值,您可以将其重置为非常大的值,如
INT\u MAX
,这样它会一直运行,直到达到EOF

if (number_of_entries < 0) {
    number_of_entries = INT_MAX;
}
for ( i = 0; i < number_of_entries; i++ ){
    // set of for statements
    // check to see if end of file is reached
}
if(条目数<0){
_条目数=INT_MAX;
}
对于(i=0;i<条目数;i++){
//语句集
//检查是否已到达文件末尾
}
对于测试条件,始终可以使用三元运算符:

for (i = 0; ne > 0 ? i < ne : i > ne; i++)
示例使用/输出

$ ./bin/for_dual_cond 8 <~/tmp/foo.txt
 1 : after block/auto unblock
 2 : remember >> next time!
 3 : after manual unblock w/menu - restored.
 4 : signal blocked saving
 5 : comparing file names.
 6 :
 7 : $ ./bin/gtkwrite
 8 : adding app->mfp_handler: 667
对于测试条件,始终可以使用三元运算符:

for (i = 0; ne > 0 ? i < ne : i > ne; i++)
示例使用/输出

$ ./bin/for_dual_cond 8 <~/tmp/foo.txt
 1 : after block/auto unblock
 2 : remember >> next time!
 3 : after manual unblock w/menu - restored.
 4 : signal blocked saving
 5 : comparing file names.
 6 :
 7 : $ ./bin/gtkwrite
 8 : adding app->mfp_handler: 667

根据您编辑的问题,您可以声明,如果条目数为负数,则至少应运行到一个较大的数字。这可能更清楚地表达了您的意图,并避免了由于整数溢出而导致的UB:

for (int i = 0; i < (number_of_entries < 0 ? INT_MAX : number_of_entries); i++ ) {
        // set of for statements
        // check to see if end of file is reached
        // this case stops when i reaches number_of_entries or EOF
}
for(int i=0;i<(int\u条目数<0?int\u MAX:int\u条目数);i++){
//语句集
//检查是否已到达文件末尾
//当我达到\u条目的数量或EOF时,此情况停止
}

根据您编辑的问题,您可以声明,如果条目数为负数,则至少应运行到一个较大的数字。这可能更清楚地表达了您的意图,并避免了由于整数溢出而导致的UB:

for (int i = 0; i < (number_of_entries < 0 ? INT_MAX : number_of_entries); i++ ) {
        // set of for statements
        // check to see if end of file is reached
        // this case stops when i reaches number_of_entries or EOF
}
for(int i=0;i<(int\u条目数<0?int\u MAX:int\u条目数);i++){
//语句集
//检查是否已到达文件末尾
//当我达到\u条目的数量或EOF时,此情况停止
}

一个以
i
条目数
为参数,然后返回所需条件的结果的函数怎么样?你可能会