簡體   English   中英

正確使用預增量運算符並結合指針解引用運算符

[英]proper usage of the pre-increment operator in combination with the pointer dereference operator

我剛寫了以下代碼行:

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1

我的目的是在比較threshold之前增加data_ptr指向的數據結構中的count變量,並且這行代碼有效。

如果我在進行比較之前想要增加data_ptr ,我會寫這個:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2

出於好奇,我也嘗試了這行代碼:

if (++data_ptr->count > threshold) { /*...*/ } // example 3

並發現它的行為與第一個完全相同。

第一個問題: 為什么示例#3與示例#1的作用相同? 這是運營商優先考慮的問題嗎? 標准中的東西? 我不得不寫一個快速的測試程序,因為答案對我來說並不明顯。

第二個問題:我應該用不同的方式寫這個if語句嗎 我可以先在自己的行上執行增量, 然后測試條件以避免任何可能的混淆。 這是必要的,或者前兩個例子是否足夠明顯?

1)優先權

2)偏好

是的,這是運營商優先權的問題。 箭頭運算符的優先級高於增量運算符。

為了回答你的第二個問題,我通常將這種類型的結構分成兩個單獨的語句:

++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }

這強調了正在發生的事情並消除了可能的混淆。 但是,這可能是一個偏好問題。

  1. 運算符優先級決定了您觀察到的行為。
  2. 如果在本例中將增量與比較分開,則不會有太大的影響,但有時您希望在一系列條件的中間有一個增量條件,然后嘗試將增量與測試分開可能會損害通過引入嵌套來實現代碼的可讀性,否則這將是不必要的。

例如:

if (...1...)
    ...2...
else if (++data_ptr->count > threshold)
    ...3...
else
    ...4...

與:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
  1. - >運算符比++更緊密。
  2. 它們都很明確,我認為它們很容易閱讀。 如果你在同一個表達式中有對data_ptr的額外引用,事情就會變得狡猾。

暫無
暫無

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

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