【问题标题】:How to emulate Python's for-else statement in C如何在 C 中模拟 Python for-else 语句
【发布时间】:2020-10-03 17:57:12
【问题描述】:

下面是一个带有默认 else 条件的 Python 素数程序。我想在 C 中重现它,但我没有让它像 Python 一样工作:

for ix, num_float in enumerate(numbers):
        num = int(num_float)
        result = 0

        if num > 1:
            for i in range(2,num):
                if (num % i) == 0:
                    result = 0
                    out_array.append(result)
                    break
                else:
                    result = num
                    out_array.append(result)
            else:
                result = 0
                out_array.append(result)

在 Python 中,如果 (a) 输入数字 (num) 小于或等于 2,或 (b) 它到达 2,num 范围的末尾而没有找到素数,则默认(最终)else 条件触发,这触发 break 语句。

我用 C 复制了这个;它编译并运行,它与预期的输出非常匹配,但并不相同。它不写默认条件。

for (int i = 0; i < numbers_length; i++){

    num = (int64_t)numbers[i];
    int range_ctr;

    if (num > 1){
        for (range_ctr = 2; range_ctr < num; range_ctr++){
            if ((num%range_ctr) == 0){
                result = 0;
                list_of_results[list_of_results_ctr] = result;
                list_of_results_ctr++; 
                break; }
            else if ((num%range_ctr) != 0){
                result = num;
                list_of_results[list_of_results_ctr] = result;
                list_of_results_ctr++; }
        else {
            result = 0;
            list_of_results[list_of_results_ctr] = result;
            list_of_results_ctr++; }
        }
    }
}

所以我的问题是,如上所述,我怎样才能像 Python 一样用 C 语言编写默认条件?

谢谢。

【问题讨论】:

  • 输出有什么区别?
  • 在默认情况下应该写零的地方不写。
  • 我实际上从未听说过 C 语言中的for-else。我不确定将这种心态强加到 C 代码中是否是个好主意,因为我不确定其他 C 开发人员会如何应对它。 -- 当然我没有回答你的问题,但这只是一个评论。
  • 您也应该避免在 Python 中使用 loop-else。据称,BDFL Guido van Rossum wishes the feature had not been added.
  • 测试“我的循环是否提前中断?”的典型选项循环完成后,a) 测试循环计数器的最大可能值,b) 测试代码中设置的标志,该标志提前退出循环。

标签: c


【解决方案1】:

在没有标准 C 方法来模拟 Python 中默认的“else”条件的情况下,以下是 C 中适合我的方法:

for (int i = 0; i < numbers_length; i++){

    num = (int64_t)numbers[i];
    int found = 0;
    int range_ctr;

    if (num > 1){
        for (range_ctr = 2; range_ctr < num; range_ctr++){
            if ((num%range_ctr) == 0){
                result = 0;
                list_of_results[list_of_results_ctr] = result;
                list_of_results_ctr++; 
                found = 1;
                break; }
            else if ((num%range_ctr) != 0){
                result = num;
                list_of_results[list_of_results_ctr] = result;
                list_of_results_ctr++; }
        }

        if (found == 0){
            result = 0;
            list_of_results[list_of_results_ctr] = result;
            list_of_results_ctr++; }                    
    }
}

我添加了一个名为“found”的标志,并将默认条件移到了 for 循环之外。

感谢所有回答的人。

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2023-04-02
    • 2019-01-26
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多