簡體   English   中英

循環條件中的三元運算符:評估順序/操作。 優先順序不清楚

[英]Ternary operator in loop conditional: evaluation order / op. precedence unclear

編輯:

表達式“ 3 <8”的真實組是什么? (9 <6?7:5):2> 0? 4:1”和PHP中非關聯的含義?

已作為副本提供,但涉及PHP,而不涉及C。

在為小型程序構建一些測試用例時,我在for循環的條件部分中引入了一個錯誤,如下所示:

for(int row = 0; row < (mode == TEST) ? NO_OF_TESTS : ROWS; row++){}

(我知道應該將其拉出for循環,但這不會改變問題。)

這會導致越過數組末端而導致分段錯誤,因為上述情況會導致無限循環。

當然,修復很容易:

for(row = 0; row < ((mode == TEST) ? NO_OF_TESTS : ROWS); row++)
//                 ^                                   ^

但是我對錯誤實現的行為方式更感興趣。

這是一段完整的代碼(本身沒有任何意義,因為它脫離了上下文,但可以證明問題所在)。

#include <stdio.h>
#include <stdlib.h>

#define TEST 0
#define INTERACTIVE 1

#define ROWS 2
#define NO_OF_TESTS 3
#define MAX_FRUIT_LEN 50

int main(void)
{
    char test_cases[NO_OF_TESTS][MAX_FRUIT_LEN] =
    {{"Orange"},
     {"Apple"},
     {"Pineapple"}};

    int mode = TEST;
    int row = 0;

    //This fails - but in a strange way
    //Uncomment this `for` loop and comment the other one to see the effects

    //for(int row = 0; row < (mode == TEST) ? NO_OF_TESTS : ROWS; row++)

    //With the parantheses, obviously, it works.
    for(row = 0; row < ((mode == TEST) ? NO_OF_TESTS : ROWS); row++)
    {
        printf("Working:\tIn row %d: Mode: %d condition_eval: %d\n"
        , row , mode, row < ((mode == TEST) ? NO_OF_TESTS : ROWS));

        printf("Not Working:\tIn row %d: Mode: %d condition_eval: %d\n"
        , row, mode, row < (mode == TEST) ? NO_OF_TESTS : ROWS);

        printf("Row: %d \tFruit Name: %s\n",row, test_cases[row]);
    }
    printf("\nTerminating conditional evaluation (at row %d):\n", row);

    printf("Working:\tIn row %d: Mode: %d condition_eval: %d\n"
    , row , mode, row < ((mode == TEST) ? NO_OF_TESTS : ROWS));

    printf("Not Working:\tIn row %d: Mode: %d condition_eval: %d\n"
    , row, mode, row < (mode == TEST) ? NO_OF_TESTS : ROWS);

    return 0;
}

查看輸出和(錯誤的)條件

row < (mode == TEST) ? NO_OF_TESTS : ROWS

似乎編譯器將其解釋為:

   (row < (mode == TEST)) ? NO_OF_TESTS : ROWS
// ^                    ^

問題是:為什么?

該表達式:

(mode == TEST)

可以解釋為<運算符的右操作數,還是?的左操作數? 運營商。 (但我想不能同時使用兩者。)

哪些規則適用? 這是運算符優先級的問題嗎? 序列點起作用嗎? 評價的順序是什么,為什么?

我很困惑。 任何幫助是極大的贊賞。

三元條件運算符的優先級較低。

所以

row < (mode == TEST) ? NO_OF_TESTS : ROWS

分組為

(row < (mode == TEST)) ? NO_OF_TESTS : ROWS

人們喜歡根據運算符優先級表進行思考,但實際上,分組是硬連接到語言語法中的。

問題是:為什么?

這是運算符優先級的問題嗎?

是的!

三元運算符的優先級非常危險 ,您不是第一個犯該錯誤的人,我自己做了

在表達式中保持安靜的最佳方法是添加()

是的,這是一個優先級問題-關系運算符(以及按位,邏輯,算術,一元和后綴運算符)的優先級高於三元運算符,因此表達式a < b ? c : d a < b ? c : d被解析為(a < b) ? c : d (a < b) ? c : d

如果最左邊的表達式是a && ba == ba * b等,則相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM