Cách đơn giản và sạch sẽ để so sánh ba số


11

Tôi đã có một số mã có một chuỗi các ifcông việc đó, nhưng chỉ cảm thấy lộn xộn. Về cơ bản, tôi muốn chọn số nguyên lớn nhất trong ba số nguyên và đặt cờ trạng thái để nói cái nào được chọn. Mã hiện tại của tôi trông như thế này:

a = countAs();
b = countBs();
c = countCs();

if (a > b && a > c)
    status = MOSTLY_A;
else if (b > a && b > c)
    status = MOSTLY_B;
else if (c > a && c > b)
    status = MOSTLY_C;
else
    status = DONT_KNOW;

Mô hình này xảy ra một vài lần và với các tên biến dài, sẽ hơi khó để xác nhận trực quan rằng mỗi tên iflà chính xác. Tôi cảm thấy có thể có một cách tốt hơn và rõ ràng hơn để làm điều này; bất cứ ai có thể đề nghị bất cứ điều gì?


Có một số trùng lặp tiềm năng, nhưng chúng không hoàn toàn phù hợp với câu hỏi này.

Trong đề xuất trùng lặp: Phương pháp kiểm tra nhiều điều kiện? tất cả các giải pháp được đề xuất có vẻ vụng về như mã gốc, vì vậy chúng không cung cấp giải pháp tốt hơn.

Và bài đăng này Các cách thanh lịch để xử lý nếu (nếu khác) khác chỉ liên quan đến các mức lồng nhau và sự bất đối xứng, đó không phải là vấn đề ở đây.


3
Đối với tôi vấn đề duy nhất là sự lặp lại mã. Những gì bạn có ở đây là cực kỳ rõ ràng để đọc, tại sao thay đổi điều đó? Chỉ cần chia nó thành một hàm có trạng thái a, b, c và trả về trạng thái. Nếu bạn làm cho bạn cảm thấy tốt hơn, hãy bỏ một "nội tuyến" trên đó. Không có macro, không phức tạp, chỉ cần khai thác chức năng cũ tốt. Tôi sẽ cảm ơn bạn vì mã rõ ràng của bạn nếu tôi cần phải làm việc với nó sau này.
J Trana



Lưu ý rằng #defines của bạn được đặt tên kém. Xét a = 40, b = 30, c = 30. Kết quả là MOSTLY_A. Nhưng hầu hết mọi thứ thực sự không phải là A, mà là B hoặc C. Bạn có thể muốn thử NHIỀU (mặc dù vẫn còn mơ hồ - nhiều A hơn B và nhiều A hơn C, hoặc nhiều hơn A và B kết hợp? MAX_IS_A, ...? (cũng gợi ý max (a, max (b, c)) như một câu trả lời cho câu hỏi).
tony

Câu trả lời:


12

Yếu tố logic, trở về sớm

Như được đề xuất trong các nhận xét, sẽ chỉ đơn giản là bao bọc logic của bạn trong một hàm và thoát sớm với return's để đơn giản hóa mọi thứ rất nhiều. Ngoài ra, bạn có thể tính toán một chút chức năng bằng cách ủy quyền kiểm tra cho chức năng khác. Cụ thể hơn:

bool mostly(max,u,v) {
   return max > u && max > v;
}

status_t strictly_max_3(a,b,c)
{
  if mostly(a,b,c) return MOSTLY_A;
  if mostly(b,a,c) return MOSTLY_B;
  if mostly(c,a,b) return MOSTLY_C;
  return DONT_KNOW;
}

Thời gian này ngắn hơn lần thử trước của tôi:

status_t index_of_max_3(a,b,c)
{
  if (a > b) {
    if (a == c)
      return DONT_KNOW;
    if (a > c)
      return MOSTLY_A;
    else
      return MOSTLY_C;
  } else {
    if (a == b)
      return DONT_KNOW;
    if (b > c)
      return MOSTLY_B;
    else
      return MOSTLY_C;
  }
}

Trên đây là một chút dài dòng hơn, nhưng dễ đọc IMHO và không tính toán lại so sánh nhiều lần.

Xác nhận trực quan

Trong câu trả lời của bạn, bạn nói:

vấn đề của tôi chủ yếu là xác nhận trực quan rằng tất cả các so sánh đã sử dụng cùng một biến

... Ngoài ra, trong câu hỏi của bạn, bạn nói:

Mô hình này xảy ra một vài lần và với các tên biến dài, sẽ hơi khó để xác nhận trực quan rằng mỗi cái là chính xác.

Tôi có thể không hiểu những gì bạn đang cố gắng để đạt được: bạn có muốn sao chép-dán mẫu ở mọi nơi bạn cần không? Với một chức năng như ở trên, bạn chụp mẫu một lần và bạn kiểm tra một lần cho tất cả những gì so sánh sử dụng a, bctheo yêu cầu. Sau đó, bạn không cần phải lo lắng nữa khi bạn gọi hàm. Tất nhiên, có thể trong thực tế vấn đề của bạn phức tạp hơn một chút so với vấn đề bạn mô tả: nếu vậy, vui lòng thêm một số chi tiết nếu có thể.


1
Tôi không hiểu nhận xét của bạn về DONT_KNOW , nếu c nhỏ nhất và a và b giống nhau thì sao? Thuật toán sẽ trả về b là lớn nhất, trong khi a giống như b.
Pieter B

@PieterB Tôi đã khăng khăng cho rằng sẽ không có vấn đề gì nếu chúng tôi trở lại MOSTLY_Ahoặc MOSTLY_Ctrong trường hợp a == ca > b. Điều này là cố định. Cảm ơn.
coredump

@DocBrown Được cấp, hầu hết các lợi ích đến từ hành vi thoát sớm.
coredump

1
+1, bây giờ nó thực sự là một cải tiến so với mã gốc OP.
Doc Brown

9

TL: DR; Mã của bạn đã chính xác và "sạch".

Tôi thấy rất nhiều người vặn vẹo xung quanh câu trả lời nhưng tất cả mọi người đang bỏ lỡ khu rừng xuyên qua những tán cây. Chúng ta hãy làm khoa học máy tính và phân tích toán học đầy đủ để hiểu hoàn toàn câu hỏi này.

Đầu tiên, chúng tôi lưu ý rằng chúng tôi có 3 biến, mỗi biến có 3 trạng thái: <, = hoặc>. Tổng số hoán vị là 3 ^ 3 = 27 trạng thái, tôi sẽ chỉ định một số duy nhất, ký hiệu là P #, cho mỗi trạng thái. Số P # này là một hệ thống số giai thừa .

Liệt kê tất cả các hoán vị chúng ta có:

a ? b | a ? c | b ? c |P#| State
------+-------+-------+--+------------
a < b | a < c | b < c | 0| C
a = b | a < c | b < c | 1| C
a > b | a < c | b < c | 2| C
a < b | a = c | b < c | 3| impossible a<b b<a
a = b | a = c | b < c | 4| impossible a<a
a > b | a = c | b < c | 5| A=C > B
a < b | a > c | b < c | 6| impossible a<c a>c
a = b | a > c | b < c | 7| impossible a<c a>c
a > b | a > c | b < c | 8| A
a < b | a < c | b = c | 9| B=C > A
a = b | a < c | b = c |10| impossible a<a
a > b | a < c | b = c |11| impossible a<c a>c
a < b | a = c | b = c |12| impossible a<a
a = b | a = c | b = c |13| A=B=C
a > b | a = c | b = c |14| impossible a>a
a < b | a > c | b = c |15| impossible a<c a>c
a = b | a > c | b = c |16| impossible a>a
a > b | a > c | b = c |17| A
a < b | a < c | b > c |18| B
a = b | a < c | b > c |19| impossible b<c b>c
a > b | a < c | b > c |20| impossible a<c a>c
a < b | a = c | b > c |21| B
a = b | a = c | b > c |22| impossible a>a
a > b | a = c | b > c |23| impossible c>b b>c
a < b | a > c | b > c |24| B
a = b | a > c | b > c |25| A=B > C
a > b | a > c | b > c |26| A

Bằng cách kiểm tra chúng tôi thấy chúng tôi có:

  • 3 trạng thái trong đó A là tối đa,
  • 3 trạng thái trong đó B là tối đa,
  • 3 trạng thái trong đó C là cực đại và
  • 4 trạng thái trong đó A = B hoặc B = C.

Hãy viết một chương trình (xem chú thích) để liệt kê tất cả các hoán vị này với các giá trị cho A, B và C. Sắp xếp ổn định theo P #:

a ?? b | a ?? c | b ?? c |P#| State
1 <  2 | 1 <  3 | 2 <  3 | 0| C
1 == 1 | 1 <  2 | 1 <  2 | 1| C
1 == 1 | 1 <  3 | 1 <  3 | 1| C
2 == 2 | 2 <  3 | 2 <  3 | 1| C
2  > 1 | 2 <  3 | 1 <  3 | 2| C
2  > 1 | 2 == 2 | 1 <  2 | 5| ??
3  > 1 | 3 == 3 | 1 <  3 | 5| ??
3  > 2 | 3 == 3 | 2 <  3 | 5| ??
3  > 1 | 3  > 2 | 1 <  2 | 8| A
1 <  2 | 1 <  2 | 2 == 2 | 9| ??
1 <  3 | 1 <  3 | 3 == 3 | 9| ??
2 <  3 | 2 <  3 | 3 == 3 | 9| ??
1 == 1 | 1 == 1 | 1 == 1 |13| ??
2 == 2 | 2 == 2 | 2 == 2 |13| ??
3 == 3 | 3 == 3 | 3 == 3 |13| ??
2  > 1 | 2  > 1 | 1 == 1 |17| A
3  > 1 | 3  > 1 | 1 == 1 |17| A
3  > 2 | 3  > 2 | 2 == 2 |17| A
1 <  3 | 1 <  2 | 3  > 2 |18| B
1 <  2 | 1 == 1 | 2  > 1 |21| B
1 <  3 | 1 == 1 | 3  > 1 |21| B
2 <  3 | 2 == 2 | 3  > 2 |21| B
2 <  3 | 2  > 1 | 3  > 1 |24| B
2 == 2 | 2  > 1 | 2  > 1 |25| ??
3 == 3 | 3  > 1 | 3  > 1 |25| ??
3 == 3 | 3  > 2 | 3  > 2 |25| ??
3  > 2 | 3  > 1 | 2  > 1 |26| A

Trong trường hợp bạn đang tự hỏi làm thế nào tôi biết trạng thái P # nào là không thể, thì bây giờ bạn đã biết. :-)

Số lượng so sánh tối thiểu để xác định thứ tự là:

Nhật ký 2 (27) = Nhật ký (27) / Nhật ký (2) = ~ 4,75 = 5 so sánh

tức là coredump đã đưa ra đúng 5 số so sánh tối thiểu. Tôi sẽ định dạng mã của mình là:

status_t index_of_max_3(a,b,c)
{
    if (a > b) {
        if (a == c) return DONT_KNOW; // max a or c
        if (a >  c) return MOSTLY_A ;
        else        return MOSTLY_C ;
    } else {
        if (a == b) return DONT_KNOW; // max a or b
        if (b >  c) return MOSTLY_B ;
        else        return MOSTLY_C ;
    }
}

Đối với vấn đề của bạn, chúng tôi không quan tâm đến việc kiểm tra sự bình đẳng để chúng tôi có thể bỏ qua 2 bài kiểm tra.

Không quan trọng mã sạch / xấu đến mức nào nếu nhận được câu trả lời sai vì vậy đây là một dấu hiệu tốt cho thấy bạn đang xử lý tất cả các trường hợp một cách chính xác!

Tiếp theo, để đơn giản, mọi người tiếp tục cố gắng "cải thiện" câu trả lời, trong đó họ nghĩ rằng cải thiện có nghĩa là "tối ưu hóa" số lượng so sánh, nhưng đó không hoàn toàn là những gì bạn đang hỏi. Bạn đã nhầm lẫn tất cả mọi người nơi bạn hỏi "Tôi cảm thấy có thể tốt hơn" nhưng không xác định "tốt hơn" nghĩa là gì. So sánh ít hơn? Ít mã hơn? So sánh tối ưu?

Bây giờ vì bạn đang hỏi về khả năng đọc mã (tính chính xác), tôi sẽ chỉ thực hiện một thay đổi đối với mã của bạn để dễ đọc: Căn chỉnh thử nghiệm đầu tiên với các thử nghiệm khác.

        if      (a > b && a > c)
            status = MOSTLY_A;
        else if (b > a && b > c)
            status = MOSTLY_B;
        else if (c > a && c > b)
            status = MOSTLY_C;
        else
            status = DONT_KNOW; // a=b or b=c, we don't care

Cá nhân tôi sẽ viết nó theo cách sau nhưng điều này có thể quá không chính thống cho các tiêu chuẩn mã hóa của bạn:

        if      (a > b && a > c) status = MOSTLY_A ;
        else if (b > a && b > c) status = MOSTLY_B ;
        else if (c > a && c > b) status = MOSTLY_C ;
        else /*  a==b  || b ==c*/status = DONT_KNOW; // a=b or b=c, we don't care

Lưu ý: Đây là mã C ++ để tạo các hoán vị:

#include <stdio.h>

char txt[]  = "< == > ";
enum cmp      { LESS, EQUAL, GREATER };
int  val[3] = { 1, 2, 3 };

enum state    { DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C };
char descr[]= "??A B C ";

cmp Compare( int x, int y ) {
    if( x < y ) return LESS;
    if( x > y ) return GREATER;
    /*  x==y */ return EQUAL;
}

int main() {
    int i, j, k;
    int a, b, c;

    printf( "a ?? b | a ?? c | b ?? c |P#| State\n" );
    for( i = 0; i < 3; i++ ) {
        a = val[ i ];
        for( j = 0; j < 3; j++ ) {
            b = val[ j ];
            for( k = 0; k < 3; k++ ) {
                c = val[ k ];

                int cmpAB = Compare( a, b );
                int cmpAC = Compare( a, c );
                int cmpBC = Compare( b, c );
                int n     = (cmpBC * 9) + (cmpAC * 3) + cmpAB; // Reconstruct unique P#

                printf( "%d %c%c %d | %d %c%c %d | %d %c%c %d |%2d| "
                    , a, txt[cmpAB*2+0], txt[cmpAB*2+1], b
                    , a, txt[cmpAC*2+0], txt[cmpAC*2+1], c
                    , b, txt[cmpBC*2+0], txt[cmpBC*2+1], c
                    , n
                );

                int status;
                if      (a > b && a > c) status = MOSTLY_A;
                else if (b > a && b > c) status = MOSTLY_B;
                else if (c > a && c > b) status = MOSTLY_C;
                else /*  a ==b || b== c*/status = DONT_KNOW; // a=b, or b=c

                printf( "%c%c\n", descr[status*2+0], descr[status*2+1] );
            }
        }
    }
    return 0;
}

Chỉnh sửa: Dựa trên phản hồi, di chuyển TL: DR lên đầu, xóa bảng chưa sắp xếp, làm rõ 27, xóa mã, mô tả trạng thái không thể.


-1: sẽ không giảm số lượng quyết định dẫn đến đường dẫn mã đơn giản hơn và mã dễ đọc hơn? Bạn tranh luận không rõ ràng: đầu tiên, bạn nói mọi người đều sai; Sau đó, bạn đặt không phải một hoặc hai mà là ba bảng; Tôi hy vọng họ sẽ dẫn đến một cách đơn giản hơn để tính kết quả nhưng thay vào đó bạn đã xác nhận những gì mọi người khác đã biết (mã của OP thực hiện đúng). Chắc chắn, câu hỏi là về khả năng đọc, nhưng khả năng đọc không chỉ đạt được bằng cách sửa đổi bố cục mã (bạn thừa nhận những thay đổi của bạn sẽ khó phù hợp với tiêu chuẩn mã hiện tại). Nó có ý nghĩa để đơn giản hóa logic khi tối ưu hóa cho khả năng đọc.
coredump

Xây dựng hơn: Tôi đề nghị đơn giản hóa câu trả lời của bạn bằng cách bỏ qua một số chi tiết và suy nghĩ về cấu trúc câu trả lời của bạn. Tôi đánh giá cao rằng bạn đã dành thời gian để viết và đăng các mã hoán đổi mã C ++, nhưng có lẽ bạn có thể đưa ra kết quả chính và chỉ có một bảng: như bây giờ, có vẻ như bạn đã bỏ tất cả công việc của mình. Tôi gần như không thể phát hiện ra điều TL; DR (bạn có thể bắt đầu với điều đó). Hy vọng nó giúp.
coredump

2
Cảm ơn các coredump phản hồi xây dựng. Tôi đã xóa bảng chưa được sắp xếp giữa vì nó dễ dàng được xác minh.
Michaelangel007

2
Chúa ơi! Ai sẽ nói so sánh ba số gần như phức tạp như khoa học tên lửa?
Mandrill

@Mandrill Là nhà khoa học máy tính, công việc của chúng tôi là tìm hiểu vấn đề một cách thấu đáo . Chỉ bằng cách liệt kê tất cả 27 hoán vị có thể có để so sánh 3 chiều, chúng tôi mới có thể xác minh rằng giải pháp của chúng tôi hoạt động trong TẤT CẢ các trường hợp. Điều cuối cùng chúng tôi muốn là các lập trình viên là các lỗi ẩn và các trường hợp cạnh không được tính. Độ dài là giá mà người ta phải trả cho sự đúng đắn.
Michaelangel007

5

@msw bảo bạn sử dụng một mảng thay vì a, b, c và @Basile bảo bạn tái cấu trúc logic "max" thành một hàm. Kết hợp hai ý tưởng này dẫn đến

val[0] = countAs();    // in the real code, one should probably define 
val[1] = countBs();    // some enum for the indexes 0,1,2 here
val[2] = countCs();

 int result[]={DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C};

sau đó cung cấp một hàm tính toán chỉ số tối đa của một mảng tùy ý:

// returns the index of the strict maximum, and -1 when the maximum is not strict
int FindStrictMaxIndex(int *values,int arraysize)
{
    int maxVal=INT_MIN;
    int maxIndex=-1;
    for(int i=0;i<arraysize;++i)
    {
       if(values[i]>maxVal)
       {
         maxVal=values[i];
         maxIndex=i;
       }
       else if (values[i]==maxVal)
       {
         maxIndex=-1;
       }
    }
    return maxIndex;
}

và gọi nó như

 return result[FindStrictMaxIndex(val,3)+1];

Tổng số LỘC dường như đã tăng so với ban đầu, nhưng bây giờ bạn có logic cốt lõi trong một chức năng có thể sử dụng lại và nếu bạn có thể sử dụng lại chức năng nhiều lần, nó sẽ bắt đầu được đền đáp. Ngoài ra, FindStrictMaxIndexchức năng này không còn đan xen với "yêu cầu kinh doanh" của bạn nữa (tách mối quan tâm), do đó, rủi ro bạn sẽ phải sửa đổi sau này thấp hơn nhiều so với phiên bản gốc (nguyên tắc đóng mở). Ví dụ, hàm đó sẽ không phải thay đổi ngay cả khi số lượng đối số thay đổi hoặc cần sử dụng các giá trị trả về khác ngoài MOSTLY_ABC hoặc bạn đang xử lý các biến khác ngoài a, b, c. Hơn nữa, việc sử dụng một mảng thay vì 3 giá trị khác nhau a, b, c cũng có thể đơn giản hóa mã của bạn ở những nơi khác.

Tất nhiên, nếu trong toàn bộ chương trình của bạn chỉ có một hoặc hai nơi để gọi hàm này và bạn không có bất kỳ ứng dụng nào nữa để giữ các giá trị trong một mảng, thì có lẽ tôi sẽ để lại mã gốc như nó (hoặc sử dụng @ cải tiến của coredump).


Tôi thích điều đó - sự can đảm của FindStrictMaxIndex()có thể không quá sạch sẽ, nhưng từ quan điểm của người gọi, rõ ràng là những gì đang cố gắng đạt được.
Ken YN

Hoặc thay vì giữ hai mảng, giữ một mảng các cặp khóa-giá trị: {MOSTLY_A, CountAs ()}, lấy phần tử đầu tiên được sắp xếp theo giá trị và đọc khóa.
Julia Hayward

@JuliaHayward: lý do chính khiến tôi không đề xuất giải pháp như vậy là thẻ "C" của câu hỏi - trong C, người ta sẽ cần thêm một số mã soạn sẵn để xử lý các cặp giá trị khóa và tạo một hàm được nhập theo thuật ngữ KVPs có lẽ sẽ không thể tái sử dụng trong các ngữ cảnh khác nhau hơn là một inthàm gõ đơn giản . Nhưng tôi đồng ý với nhận xét của bạn nếu một người sử dụng một ngôn ngữ khác như Python hoặc Perl.
Doc Brown

1
@ gnasher729: nó phụ thuộc vào số lượng "trùng lặp" trong mã gốc, mức độ giống nhau của chúng và mức độ thường xuyên FindStrictMaxIndexsử dụng chức năng. Đối với một hoặc chỉ hai lần tái sử dụng, tất nhiên điều này sẽ không được đền đáp, nhưng đó là những gì tôi đã viết trong câu trả lời của mình. Cũng lưu ý những lợi thế khác mà tôi đã đề cập ở trên liên quan đến những thay đổi trong tương lai.
Doc Brown

1
... Và lưu ý rằng 8 dòng gốc có thể được thay thế bằng một lớp lót đơn giản return result[FindStrictMaxIndex(val,3)]; tại điểm trong mã nơi 8 dòng gốc được đặt . Các bộ phận khác, đặc biệt là FindStrictMaxIndexchính nó được tách biệt hoàn toàn khỏi "logic kinh doanh", điều này đưa chúng ra khỏi trọng tâm thay đổi các yêu cầu kinh doanh.
Doc Brown

-1

Bạn có thể nên sử dụng một macro hoặc một hàm MAX cho tối đa hai số.

Sau đó, bạn chỉ muốn:

 status = MAX(a,MAX(b,c));

Bạn có thể đã xác định

 #define MAX(X,Y) (((X)>(Y))?(X):(Y))

nhưng hãy thận trọng - đặc biệt là về tác dụng phụ - khi sử dụng macro (vì MAX(i++,j--) sẽ hành xử kỳ lạ)

Vì vậy, tốt hơn nên xác định một chức năng

 static inline int max2ints(int x, int y) {
    return (x>y)?x:y;
 }

và sử dụng nó (hoặc ít nhất là #define MAX(X,Y) max2ints((X),(Y))....)

Nếu bạn cần phải hiểu nguồn gốc của MAX bạn có thể có một vĩ mô dài như #define COMPUTE_MAX_WITH_CAUSE(Status,Result,X,Y,Z) đó là một chặng đường dài do{... }while(0) vĩ mô, có lẽ

#define COMPUTE_MAX_WITH_CAUSE(Status,Result,X,Y,Z) do { \
  int x= (X), y= (Y), z=(Z); \
  if (x > y && y > z) \
    { Status = MOSTLY_FIRST; Result = x; } \
  else if (y > x && y > z) \
    { Status = MOSTLY_SECOND; Result = y; } \
  else if (z > x && z > y) \
    { Status = MOSTLY_THIRD; Result = z; } \
  /* etc */ \
  else { Status = UNKNOWN; Result = ... } \
} while(0)

Sau đó, bạn có thể gọi COMPUTE_MAX_WITH_CAUSE(status,res,a,b,c) ở một số nơi. Nó hơi xấu xí. Tôi định nghĩa các biến địa phương x, y, z để giảm tác dụng phụ xấu ....


2
Tái cấu trúc logic chung thành một hàm là cách tiếp cận đúng, nhưng tôi thực sự sẽ tránh hai điều ở đây: 1. Tôi sẽ không "phát minh" các yêu cầu mới (OP không yêu cầu tính toán tối đa). Và thứ 2: ngay cả khi mã kết quả có thể trở nên KHÔ hơn, sẽ rất gây tranh cãi nếu điều này biện minh cho một macro phức tạp.
Doc Brown

1
Macro nên là một công cụ của phương sách cuối cùng. Chắc chắn ra khỏi giới hạn cho vấn đề này.
kevin cline

-1

Tôi đã suy nghĩ nhiều hơn về vấn đề này, vì vậy vấn đề của tôi chủ yếu là xác nhận trực quan rằng tất cả các so sánh đều sử dụng cùng một biến, tôi nghĩ rằng đây có thể là một cách tiếp cận hữu ích:

a = countAs();
b = countBs();
c = countCs();

if (FIRST_IS_LARGEST(a, b, c))
    status = MOSTLY_A;
else if (SECOND_IS_LARGEST(a, b, c))
    status = MOSTLY_B;
else if (THIRD_IS_LARGEST(a, b, c))
    status = MOSTLY_C;
else
    status = DONT_KNOW; /* NO_SINGLE_LARGEST is a better name? */

Rằng mỗi vĩ mô mất a, bctheo thứ tự rất dễ dàng để xác nhận, và tên macro tiết kiệm cho tôi phải tìm ra những gì tất cả các so sánh và AND đang làm.


1
(1) tại sao các macro phụ trợ thay vì các chức năng? (2) tại sao bạn cần xác nhận trực quan ở đây? nó thực sự là vấn đề cốt lõi của bạn hay là nhu cầu xác nhận trực quan là hậu quả của việc sao chép mã? Tùy chọn tốt nhất của bạn là nhân mã của bạn thành một hàm đơn giản mà bạn kiểm tra một lần cho tất cả .
coredump
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.