删除break和continue语句

删除break和continue语句,c,break,continue,C,Break,Continue,有人能推荐一种替代我的中断和继续声明的方法吗?我知道不使用它们是很好的做法。我正在考虑使用一段时间,但是,这将使条件混乱。有没有更干净的方法?我使用的是C。由于要求,我不能有任何一个 int inCmpStr( char *a, char *b) { int i; for (i = 0 ; a[i] && b[i]; ++i){ if (a[i] == b[i] || (a[i] ^ 32) == b[i]){ con

有人能推荐一种替代我的中断和继续声明的方法吗?我知道不使用它们是很好的做法。我正在考虑使用一段时间,但是,这将使条件混乱。有没有更干净的方法?我使用的是C。由于要求,我不能有任何一个

int inCmpStr( char *a, char *b)
{   
    int i;
    for (i = 0 ; a[i] && b[i]; ++i){
        if (a[i] == b[i] || (a[i] ^ 32) == b[i]){
            continue;
        }
        else {
            break; 
        }
    }
    if(a[i] == b[i]){
        return 0;
    }
    if ((a[i] | 32) < (b[i] | 32)){
        return -1;
    }
    return 1;
}

您可以使用子函数来避免使用中断和继续

int cmpChar(char a, char b) 
{
    if (a == b || (a ^ 32) == b) {
        return -1;
    }

    if (a == b) {
        return 0;
    }

    if ((a | 32) < (b | 32)){
        return -1;
    }

    return 1;
}

int inCmpStr( char *a, char *b)
{   
    int i;
    int result;

    for (i = 0 ; a[i] && b[i]; ++i){
        result = cmpChar(a[i], b[i]);
        if (result != -1) {
            return result;
        }
    }

    return 1;
}

您可以使用子函数来避免使用中断和继续

int cmpChar(char a, char b) 
{
    if (a == b || (a ^ 32) == b) {
        return -1;
    }

    if (a == b) {
        return 0;
    }

    if ((a | 32) < (b | 32)){
        return -1;
    }

    return 1;
}

int inCmpStr( char *a, char *b)
{   
    int i;
    int result;

    for (i = 0 ; a[i] && b[i]; ++i){
        result = cmpChar(a[i], b[i]);
        if (result != -1) {
            return result;
        }
    }

    return 1;
}
此代码:

for (start; X; increment)
    if (Y)
        continue;
    else
        break;
相当于:

for (start; X && Y; increment)
    ;
因此,您可以使用:

int i;
for (i = 0; a[i] && b[i] && (a[i] == b[i] || (a[i] ^ 32) == b[i]); ++i)
    ;
此代码:

for (start; X; increment)
    if (Y)
        continue;
    else
        break;
相当于:

for (start; X && Y; increment)
    ;
因此,您可以使用:

int i;
for (i = 0; a[i] && b[i] && (a[i] == b[i] || (a[i] ^ 32) == b[i]); ++i)
    ;


如果循环中没有其他内容,则不需要显式continue,因此可以反转条件并仅中断。另外,中断和继续本身并不是不好的做法。@Ry-不幸的是,由于规范的原因,我需要完全删除它们。什么样的规范?如果他们禁止中断并继续,他们可能很愚蠢,但我明白,有时我们别无选择,只能遵守愚蠢的规范:@Ry-:我不理解对此类规范的抱怨。它们显然来自学校的作业,教师经常指定不要使用语言的X部分,因为他们希望你学习语言的Y部分。它是一种常见的技术,不仅在计算机科学中,而且在几乎任何学科中都是如此。例如,摄影教师将指定项目不使用颜色或限制照明。我们的目标是教学,而不是解决现实世界中的问题;对于特定作业或整个课程,可能需要遵循规范,但语言提供这些规范是有原因的——它们有时是有用的。break语句在交换机中非常重要。您使用它们的方式不是惯用的C语言,而且您使用break的频率远远高于使用continue的频率,但是在现实世界中,与您的课程相反,使用break并不是自动错误的。事实上,它们通常比使用goto和标签等替代方法更可取。如果循环中没有其他内容,则不需要显式continue,因此反转条件并仅中断。另外,中断和继续本身并不是不好的做法。@Ry-不幸的是,由于规范的原因,我需要完全删除它们。什么样的规范?如果他们禁止中断并继续,他们可能很愚蠢,但我明白,有时我们别无选择,只能遵守愚蠢的规范:@Ry-:我不理解对此类规范的抱怨。它们显然来自学校的作业,教师经常指定不要使用语言的X部分,因为他们希望你学习语言的Y部分。它是一种常见的技术,不仅在计算机科学中,而且在几乎任何学科中都是如此。例如,摄影教师将指定项目不使用颜色或限制照明。我们的目标是教学,而不是解决现实世界中的问题;对于特定作业或整个课程,可能需要遵循规范,但语言提供这些规范是有原因的——它们有时是有用的。break语句在交换机中非常重要。您使用它们的方式不是惯用的C语言,而且您使用break的频率远远高于使用continue的频率,但是在现实世界中,与您的课程相反,使用break并不是自动错误的。事实上,它们通常比使用goto和标签等选项更可取。由于规范的原因,我的代码中不能有这两个选项。你不能使用子函数吗?@Dstang:如果你有奇怪的规则,你必须告诉我们奇怪的规则是什么。除非有明确指示,否则人们会使用整个语言。“无子功能”规则最好是分配任务的临时规则。否则,你最好放弃这门课程-规则很特殊,在现实世界中并不现实。@sundb我的意思是在break或continue语句中都有。@dstange如果你不想使用break或continue,使用子方法更合适。由于规范的原因,我的代码中不能有任何子方法。你不能使用子函数吗?@Dstang:如果你有奇怪的规则,你必须告诉我们这些奇怪的规则是什么。除非有明确指示,否则人们会使用整个语言。“无子功能”规则最好是分配任务的临时规则。否则,您最好放弃这门课程-这些规则很特殊,在现实世界中并不现实。@sundb我的意思是在break或continue语句中都有。@dstange如果您不想使用break或continue,则使用submethods更合适。