Lợi ích của việc chấm dứt nếu khác người khác nếu xây dựng với một mệnh đề khác là gì?


136

Tổ chức của chúng tôi có một quy tắc mã hóa bắt buộc (không có bất kỳ lời giải thích nào) rằng:

if Khác khác nếu các cấu trúc nên được kết thúc bằng một mệnh đề khác

Ví dụ 1:

if ( x < 0 )
{
   x = 0;
} /* else not needed */

Ví dụ 2:

if ( x < 0 )
{
    x = 0;
}
else if ( y < 0 )
{
    x = 3;
}
else    /* this else clause is required, even if the */
{       /* programmer expects this will never be reached */
        /* no change in value of x */
}

Trường hợp cạnh này được thiết kế để xử lý?

Điều cũng làm tôi lo lắng về lý do là Ví dụ 1 không cần elsenhưng Ví dụ 2 thì không. Nếu lý do là khả năng sử dụng lại và mở rộng, tôi nghĩ elsenên được sử dụng trong cả hai trường hợp.


30
Có thể hỏi công ty của bạn cho lý do và lợi ích. Thoạt nhìn, nó buộc lập trình viên phải suy nghĩ về nó và thêm một bình luận "không cần hành động". Lý do tương tự đằng sau (và ít nhất là gây tranh cãi như) các ngoại lệ được kiểm tra của Java.
Thilo

32
Ví dụ 2 thực sự là một ví dụ điển hình cho việc assert(false, "should never go here")có thể có ý nghĩa
Thilo

2
Tổ chức của chúng tôi có các quy tắc tương tự nhưng không hoàn toàn chi tiết này. Mục đích trong trường hợp của chúng tôi là hai lần. Đầu tiên, tính nhất quán của mã. Thứ hai, không có chuỗi lỏng lẻo / khả năng đọc. Yêu cầu khác, ngay cả khi không cần thiết, thêm sự rõ ràng vào mã ngay cả khi nó không được ghi lại. Yêu cầu người khác là điều tôi đã làm trong quá khứ, ngay cả khi không cần thiết, chỉ để đảm bảo rằng tôi đã tính đến tất cả các kết quả có thể có trong ứng dụng.
LuvnJesus

4
Bạn luôn có thể đánh bại nếu với if (x < 0) { x = 0; } else { if (y < 0) { x = 3; }}. Hoặc bạn chỉ có thể làm theo các quy tắc như vậy, nhiều trong số đó là ngu ngốc, đơn giản là vì bạn được yêu cầu.
Jim Balter

3
@Thilo Tôi hơi muộn, nhưng vẫn chưa có ai mắc lỗi: Không có dấu hiệu nào cho thấy điều khác không bao giờ xảy ra, chỉ là nó không có tác dụng phụ (có vẻ như bình thường khi thực hiện < 0kiểm tra), vì vậy điều đó khẳng định là sẽ xảy ra để phá vỡ chương trình về những gì có lẽ là trường hợp phổ biến nhất trong đó các giá trị nằm trong giới hạn dự kiến.
Loduwijk

Câu trả lời:


148

Như đã đề cập trong một câu trả lời khác, đây là từ hướng dẫn mã hóa MISRA-C. Mục đích là lập trình phòng thủ, một khái niệm thường được sử dụng trong lập trình quan trọng.

Đó là, mọi if - else ifphải kết thúc bằng một else, và mọi switchphải kết thúc bằng một default.

Có hai lý do cho việc này:

  • Mã tài liệu tự. Nếu bạn viết một elsenhưng để trống, điều đó có nghĩa là: "Tôi chắc chắn đã xem xét kịch bản khi cả hai đều ifkhông else ifđúng".

    Không viết một elsecó nghĩa là: "hoặc là tôi coi là kịch bản mà không phải ifvà cũng không else ifcó thật, hoặc tôi hoàn toàn quên xem xét nó và có khả năng một lỗi chất béo ngay tại đây trong mã của tôi".

  • Dừng mã chạy trốn. Trong phần mềm quan trọng, bạn cần phải viết các chương trình mạnh mẽ, thậm chí rất khó xảy ra. Vì vậy, bạn có thể thấy mã như

    if (mybool == TRUE) 
    {
    } 
    else if (mybool == FALSE) 
    {
    }
    else
    {
      // handle error
    }
    

    Mã này sẽ hoàn toàn xa lạ với các lập trình viên PC và các nhà khoa học máy tính, nhưng nó hoàn toàn có ý nghĩa trong phần mềm quan trọng, vì nó bắt được trường hợp "mybool" bị hỏng, vì bất kỳ lý do gì.

    Trong lịch sử, bạn sẽ sợ hỏng bộ nhớ RAM vì EMI / nhiễu. Đây không phải là một vấn đề ngày hôm nay. Nhiều khả năng, hỏng bộ nhớ xảy ra do các lỗi khác trong mã: con trỏ đến các vị trí sai, lỗi ngoài mảng, lỗi tràn ngăn xếp, mã chạy trốn, v.v.

    Vì vậy, hầu hết thời gian, mã như thế này quay trở lại để tự tát vào mặt bạn khi bạn đã viết lỗi trong giai đoạn thực hiện. Có nghĩa là nó cũng có thể được sử dụng như một kỹ thuật gỡ lỗi: chương trình bạn đang viết cho bạn biết khi bạn có lỗi viết.


BIÊN TẬP

Về lý do tại sao elsekhông cần thiết sau mỗi lần duy nhất if:

Một if-elsehoặc if-else if-elsehoàn toàn bao gồm tất cả các giá trị có thể mà một biến có thể có. Nhưng một iftuyên bố đơn giản không nhất thiết phải có để bao gồm tất cả các giá trị có thể, nó có cách sử dụng rộng hơn nhiều. Thông thường bạn chỉ muốn kiểm tra một điều kiện nhất định và nếu nó không được đáp ứng, thì không làm gì cả. Sau đó, nó chỉ đơn giản là không có ý nghĩa để viết chương trình phòng thủ để bao quát elsevụ án.

Thêm vào đó, nó sẽ làm lộn xộn mã hoàn toàn nếu bạn viết trống elsesau mỗi lần if.

MISRA-C: 2012 15.7 không đưa ra lý do tại sao elsekhông cần thiết, nó chỉ nêu:

Lưu ý: một elsetuyên bố cuối cùng là không cần thiết cho một if tuyên bố đơn giản .


6
Nếu bộ nhớ bị hỏng, tôi hy vọng nó sẽ bị hỏng nhiều hơn chỉ là mybool, bao gồm cả chính mã kiểm tra. Tại sao bạn không thêm một khối xác minh rằng bạn if/else if/elseđã biên dịch theo những gì bạn mong đợi? Và sau đó một lần nữa để xác minh xác minh trước là tốt?
Oleg V. Volkov

49
Thở dài. Hãy nhìn xem, nếu bạn hoàn toàn không có kinh nghiệm nào khác ngoài lập trình máy tính để bàn, thì không cần phải biết tất cả những nhận xét về thứ mà bạn rõ ràng không có kinh nghiệm. Điều này luôn xảy ra khi lập trình phòng thủ được thảo luận và lập trình viên PC dừng lại. Tôi đã thêm nhận xét "Mã này sẽ hoàn toàn xa lạ với các lập trình viên PC" vì một lý do. Bạn không lập trình phần mềm quan trọng an toàn để chạy trên máy tính để bàn dựa trên RAM . Giai đoạn = Stage. Bản thân mã sẽ nằm trong flash ROM với tổng kiểm tra ECC và / hoặc CRC.
Lundin

6
@Ded repeatator Thật vậy (trừ khi myboolcó kiểu không phải boolean, như trường hợp trước khi C có chính nó bool, thì trình biên dịch sẽ không đưa ra giả định mà không cần phân tích tĩnh thêm). Và với chủ đề 'Nếu bạn viết một cái khác nhưng để trống, điều đó có nghĩa là: "Tôi chắc chắn đã xem xét kịch bản khi cả nếu không và nếu không phải là sự thật".': Phản ứng đầu tiên của tôi là cho rằng lập trình viên quên đặt mã vào khối khác, tại sao có một khối trống khác chỉ ngồi đó? Một // unusedbình luận sẽ phù hợp, không chỉ là một khối trống.
JAB

5
@JAB Có, elsekhối cần chứa một số loại nhận xét nếu không có mã. Thực hành phổ biến cho trống elselà một dấu chấm phẩy duy nhất cộng với một nhận xét : else { ; // doesn't matter }. Vì không có lý do tại sao bất cứ ai khác chỉ cần gõ một dấu hai chấm đơn, thụt vào một dòng của riêng nó. Thực hành tương tự đôi khi được sử dụng trong các vòng lặp trống : while(something) { ; // do nothing }. (mã bị ngắt dòng, rõ ràng. Nhận xét SO không cho phép họ)
Lundin

5
Tôi muốn lưu ý rằng mã mẫu này có hai IF và các mã khác có thể chuyển sang mã khác ngay cả trong phần mềm máy tính để bàn thông thường trong môi trường đa luồng, do đó, giá trị của mybool có thể được thay đổi ngay giữa
Iłya Bursov

61

Công ty của bạn đã làm theo hướng dẫn mã hóa MISRA. Có một vài phiên bản của các hướng dẫn có chứa quy tắc này, nhưng từ Misra-C: 2004 :

Quy tắc 14.10 (bắt buộc): Tất cả nếu khác khác nếu các cấu trúc sẽ được chấm dứt bằng một mệnh đề khác.

Quy tắc này áp dụng bất cứ khi nào một câu lệnh if được theo sau bởi một hoặc nhiều câu lệnh if khác; cuối cùng khác ifsẽ được theo sau bởi một else tuyên bố. Trong trường hợp của một ifcâu lệnh đơn giản thì else câu lệnh không cần được đưa vào. Yêu cầu cho một else tuyên bố cuối cùng là lập trình phòng thủ. Các elsetuyên bố một trong hai sẽ có hành động thích hợp hoặc có chứa một bình luận phù hợp là tại sao không có hành động được thực hiện. Điều này phù hợp với yêu cầu phải có một defaultmệnh đề cuối cùng trong một switchtuyên bố. Ví dụ mã này là một câu lệnh if đơn giản:

if ( x < 0 )
{
 log_error(3);
 x = 0;
} /* else not needed */

trong khi đoạn mã sau biểu thị một if, else ifxây dựng

if ( x < 0 )
{
 log_error(3);
 x = 0;
}
else if ( y < 0 )
{
 x = 3;
}
else /* this else clause is required, even if the */
{ /* programmer expects this will never be reached */
 /* no change in value of x */
}

Trong MISRA-C: 2012 , thay thế phiên bản 2004 và là khuyến nghị hiện tại cho các dự án mới, quy tắc tương tự tồn tại nhưng được đánh số 15.7 .

Ví dụ 1: trong một câu lệnh if lập trình viên có thể cần kiểm tra n số điều kiện và thực hiện thao tác đơn.

if(condition_1 || condition_2 || ... condition_n)
{
   //operation_1
}

Trong sử dụng thường xuyên, thực hiện thao tác không cần thiết mọi lúc khi ifđược sử dụng.

Ví dụ 2: Ở đây lập trình viên kiểm tra n số điều kiện và thực hiện nhiều thao tác. Trong sử dụng thường xuyên if..else ifgiống như switchbạn có thể cần phải thực hiện một hoạt động như mặc định. Vì vậy, việc sử dụng elselà cần thiết theo tiêu chuẩn misra

if(condition_1 || condition_2 || ... condition_n)
{
   //operation_1
}
else if(condition_1 || condition_2 || ... condition_n)
{
  //operation_2
}
....
else
{
   //default cause
}

hiện tại và phiên bản trước đây của những ấn phẩm có sẵn để mua thông qua webstore Misra ( qua ).


1
Cảm ơn, câu trả lời của bạn là tất cả nội dung của quy tắc Misra, nhưng tôi mong đợi câu trả lời cho sự nhầm lẫn của tôi trong phần chỉnh sửa câu hỏi.
Trevor

2
Câu trả lời tốt. Vì tò mò, những người hướng dẫn có nói gì về việc phải làm gì nếu bạn cho rằng elseđiều khoản này không thể truy cập được không? (Thay vào đó, hãy bỏ điều kiện cuối cùng, ném lỗi, có lẽ?)
jpmc26

17
Tôi sẽ bỏ phiếu cho đạo văn và các liên kết vi phạm bản quyền. Tôi sẽ chỉnh sửa bài đăng để nó trở nên rõ ràng hơn những từ của bạn và những từ của MISRA. Ban đầu câu trả lời này không có gì ngoài một bản sao / dán thô.
Lundin

8
@TrieuTheVan: Câu hỏi không được di chuyển mục tiêu . Hãy chắc chắn rằng câu hỏi của bạn đã hoàn thành trước khi bạn đăng nó.
TJ Crowder

1
@ jpmc26 Không, nhưng quan điểm của MISRA không phải là cung cấp cho bạn mã chặt chẽ, đó là cung cấp cho bạn mã an toàn. Bất kỳ trình biên dịch ngày nay sẽ tối ưu hóa mã không thể truy cập được, vì vậy không có nhược điểm.
Graham

19

Điều này tương đương với việc yêu cầu một trường hợp mặc định trong mọi chuyển đổi.

Điều này thêm sẽ làm giảm phạm vi bảo hiểm mã của chương trình của bạn.


Theo kinh nghiệm của tôi với việc chuyển kernel linux, hoặc mã android sang nền tảng khác, nhiều lần chúng tôi làm gì đó sai và trong logcat, chúng tôi thấy một số lỗi như

if ( x < 0 )
{
    x = 0;
}
else if ( y < 0 )
{
    x = 3;
}
else    /* this else clause is required, even if the */
{       /* programmer expects this will never be reached */
        /* no change in value of x */
        printk(" \n [function or module name]: this should never happen \n");

        /* It is always good to mention function/module name with the 
           logs. If you end up with "this should never happen" message
           and the same message is used in many places in the software
           it will be hard to track/debug.
        */
}

2
Đây là nơi __FILE____LINE__macro là hữu ích để làm cho vị trí nguồn dễ dàng tìm thấy nếu tin nhắn đã được in.
Peter Cordes

9

Chỉ có một lời giải thích ngắn gọn, vì tôi đã làm điều này khoảng 5 năm trước.

Không có (với hầu hết các ngôn ngữ) không có yêu cầu cú pháp để bao gồm elsecâu lệnh "null" (và không cần thiết {..}), và trong "các chương trình nhỏ đơn giản" không cần thiết. Nhưng các lập trình viên thực sự không viết "các chương trình nhỏ đơn giản", và quan trọng là, họ không viết các chương trình sẽ được sử dụng một lần và sau đó bị loại bỏ.

Khi một người viết một if / other:

if(something)
  doSomething;
else
  doSomethingElse;

tất cả có vẻ đơn giản và hầu như không nhìn thấy điểm bổ sung {..}.

Nhưng một ngày nào đó, một vài tháng kể từ bây giờ, một số lập trình viên khác (bạn sẽ không bao giờ mắc lỗi như vậy!) Sẽ cần phải "nâng cao" chương trình và sẽ thêm một tuyên bố.

if(something)
  doSomething;
else
  doSomethingIForgot;
  doSomethingElse;

Đột nhiên doSomethingElsequên mất rằng nó đáng lẽ phải ở trong elsechân.

Vì vậy, bạn là một lập trình viên nhỏ và bạn luôn luôn sử dụng {..}. Nhưng bạn viết:

if(something) {
  if(anotherThing) {
    doSomething;
  }
}

Tất cả đều tốt và tốt cho đến khi đứa trẻ mới thực hiện một sửa đổi nửa đêm:

if(something) {
  if(!notMyThing) {
  if(anotherThing) {
    doSomething;
  }
  else {
    dontDoAnything;  // Because it's not my thing.
  }}
}

Đúng, nó được định dạng không đúng, nhưng một nửa mã trong dự án cũng vậy và "trình định dạng tự động" sẽ bị bollixed bởi tất cả các #ifdefcâu lệnh. Và, tất nhiên, mã thực phức tạp hơn nhiều so với ví dụ đồ chơi này.

Thật không may (hoặc không), tôi đã ra khỏi loại điều này trong một vài năm nay, vì vậy tôi không có một ví dụ "thực tế" mới trong tâm trí - rõ ràng là ở trên và rõ ràng là một con gà trống.


7

Điều này, được thực hiện để làm cho mã dễ đọc hơn, cho các tham chiếu sau này và để làm cho nó rõ ràng hơn, đối với người đánh giá sau đó, rằng các trường hợp còn lại được xử lý cuối cùng else, không làm gì cả , vì vậy chúng không bị bỏ qua bằng cách nào đó ngay từ cái nhìn đầu tiên.

Đây là một thực hành lập trình tốt, giúp mã có thể tái sử dụngcó thể mở rộng .


6

Tôi muốn thêm vào - và một phần mâu thuẫn - các câu trả lời trước đó. Mặc dù chắc chắn thường sử dụng if-if nếu theo cách giống như chuyển đổi sẽ bao gồm toàn bộ các giá trị có thể nghĩ được cho một biểu thức, nhưng không có nghĩa là đảm bảo rằng mọi phạm vi điều kiện có thể được bao phủ hoàn toàn. Điều tương tự cũng có thể nói về chính cấu trúc chuyển đổi, do đó yêu cầu sử dụng mệnh đề mặc định, bắt tất cả các giá trị còn lại và nếu không, nếu không được yêu cầu, dù sao đi nữa, được sử dụng như một biện pháp bảo vệ khẳng định.

Bản thân câu hỏi có một ví dụ phản biện tốt: Điều kiện thứ hai hoàn toàn không liên quan đến x (đó là lý do tại sao tôi thường thích biến thể dựa trên if linh hoạt hơn so với biến thể dựa trên chuyển đổi). Từ ví dụ, rõ ràng là nếu điều kiện A được đáp ứng, x nên được đặt thành một giá trị nhất định. Nếu A không được đáp ứng, thì điều kiện B được kiểm tra. Nếu nó được đáp ứng, thì x sẽ nhận được giá trị khác. Nếu cả A và B không được đáp ứng, thì x sẽ không thay đổi.

Ở đây chúng ta có thể thấy rằng một nhánh trống khác nên được sử dụng để nhận xét về ý định của người lập trình cho người đọc.

Mặt khác, tôi không thể thấy tại sao phải có một mệnh đề khác, đặc biệt là cho câu lệnh if mới nhất và trong cùng. Trong C, không có thứ gọi là 'if if'. Chỉ có nếu và khác. Thay vào đó, theo MISRA, cấu trúc nên chính thức được thụt vào theo cách này (và tôi nên đặt dấu ngoặc nhọn mở trên đường kẻ của riêng họ, nhưng tôi không thích điều đó):

if (A) {
    // do something
}
else {
    if (B) {
        // do something else (no pun intended)
    }
    else {
        // don't do anything here
    }
}

Khi MISRA yêu cầu đặt các dấu ngoặc nhọn quanh mỗi nhánh, thì nó tự mâu thuẫn bằng cách đề cập đến "nếu ... khác nếu xây dựng".

Bất cứ ai cũng có thể tưởng tượng sự xấu xí của cây sâu làm tổ nếu cây khác, xem ở đây trên một ghi chú bên . Bây giờ hãy tưởng tượng rằng cấu trúc này có thể được mở rộng tùy ý ở bất cứ đâu. Sau đó, yêu cầu một điều khoản khác cuối cùng, nhưng không phải bất cứ nơi nào khác, trở nên vô lý.

if (A) {
    if (B) {
        // do something
    }
    // you could to something here
}
else {
    // or here
    if (B) { // or C?
        // do something else (no pun intended)
    }
    else {
        // don't do anything here, if you don't want to
    }
    // what if I wanted to do something here? I need brackets for that.
}

Vì vậy, tôi chắc chắn rằng những người đã phát triển các hướng dẫn MISRA có chuyển đổi - giống như nếu khác nếu có ý định trong tâm trí.

Cuối cùng, họ quyết định chính xác ý nghĩa của "nếu ... khác nếu xây dựng"


5

Lý do cơ bản có lẽ là phạm vi bảo hiểm mã và ẩn khác: mã sẽ hành xử như thế nào nếu điều kiện không đúng? Để kiểm tra chính hãng, bạn cần một số cách để thấy rằng bạn đã kiểm tra với điều kiện sai. Nếu mọi trường hợp kiểm thử mà bạn đã trải qua mệnh đề if, mã của bạn có thể gặp sự cố trong thế giới thực do một điều kiện mà bạn không kiểm tra.

Tuy nhiên, một số điều kiện có thể đúng như Ví dụ 1, như trên tờ khai thuế: "Nếu kết quả nhỏ hơn 0, hãy nhập 0." Bạn vẫn cần phải có một bài kiểm tra trong đó điều kiện là sai.


5

Hợp lý bất kỳ thử nghiệm ngụ ý hai chi nhánh. Bạn làm gì nếu nó đúng, và bạn làm gì nếu nó sai.

Đối với những trường hợp một trong hai chi nhánh không có chức năng, thật hợp lý để thêm nhận xét về lý do tại sao không cần phải có chức năng.

Điều này có thể có ích cho các lập trình viên bảo trì tiếp theo đi cùng. Họ không nên tìm kiếm quá xa để quyết định xem mã có đúng không. Bạn có thể loại Prehunt the Voi .

Cá nhân, nó giúp tôi vì nó buộc tôi phải xem xét trường hợp khác, và đánh giá nó. Nó có thể là một điều kiện không thể, trong trường hợp đó tôi có thể ném một ngoại lệ vì hợp đồng bị vi phạm. Nó có thể là lành tính, trong trường hợp một bình luận có thể là đủ.

Số dặm của bạn có thể thay đổi.


4

Hầu hết thời gian khi bạn chỉ có một iftuyên bố duy nhất , đó có thể là một trong những lý do như:

  • Kiểm tra chức năng bảo vệ
  • Tùy chọn khởi tạo
  • Chi nhánh xử lý tùy chọn

Thí dụ

void print (char * text)
{
    if (text == null) return; // guard check

    printf(text);
}

Nhưng khi bạn làm vậy if .. else if, đó có thể là một trong những lý do như:

  • Trường hợp chuyển đổi năng động
  • Gia công nĩa
  • Xử lý một tham số xử lý

Và trong trường hợp của bạn if .. else ifbao gồm tất cả các khả năng, trong trường hợp đó if (...)là không cần thiết, bạn chỉ có thể loại bỏ nó, bởi vì tại thời điểm đó, các giá trị duy nhất có thể là những giá trị được bao phủ bởi điều kiện đó.

Thí dụ

int absolute_value (int n)
{
    if (n == 0)
    {
        return 0;
    }
    else if (n > 0)
    {
        return n;
    }
    else /* if (n < 0) */ // redundant check
    {
        return (n * (-1));
    }
}

Và trong hầu hết các lý do này, có thể một cái gì đó không phù hợp với bất kỳ danh mục nào trong bạn if .. else if, do đó, cần xử lý chúng trong một elseđiều khoản cuối cùng , việc xử lý có thể được thực hiện thông qua thủ tục cấp doanh nghiệp, thông báo người dùng, cơ chế lỗi nội bộ, ..Vân vân.

Thí dụ

#DEFINE SQRT_TWO   1.41421356237309504880
#DEFINE SQRT_THREE 1.73205080756887729352
#DEFINE SQRT_FIVE  2.23606797749978969641

double square_root (int n)
{
         if (n  > 5)   return sqrt((double)n);
    else if (n == 5)   return SQRT_FIVE;
    else if (n == 4)   return 2.0;
    else if (n == 3)   return SQRT_THREE;
    else if (n == 2)   return SQRT_TWO;
    else if (n == 1)   return 1.0;
    else if (n == 0)   return 0.0;
    else               return sqrt(-1); // error handling
}

Điều elsekhoản cuối cùng này khá giống với một số điều khác trong các ngôn ngữ như Java, và C++, chẳng hạn như:

  • default trường hợp trong một tuyên bố chuyển đổi
  • catch(...)mà đến sau tất cả các catchkhối cụ thể
  • finally trong một điều khoản thử

2

Phần mềm của chúng tôi không phải là nhiệm vụ quan trọng, nhưng chúng tôi cũng quyết định sử dụng quy tắc này vì lập trình phòng thủ. Chúng tôi đã thêm một ngoại lệ ném vào mã không thể truy cập theo lý thuyết (switch + if-other). Và nó đã tiết kiệm cho chúng tôi nhiều lần vì phần mềm bị lỗi nhanh, ví dụ như khi một loại mới đã được thêm vào và chúng tôi quên thay đổi một hoặc hai if-if hoặc other hoặc switch. Như một phần thưởng, nó làm cho siêu dễ dàng để tìm ra vấn đề.


2

Chà, ví dụ của tôi liên quan đến hành vi không xác định, nhưng đôi khi một số người cố tỏ ra thích thú và thất bại nặng nề, hãy xem:

int a = 0;
bool b = true;
uint8_t* bPtr = (uint8_t*)&b;
*bPtr = 0xCC;
if(b == true)
{
    a += 3;
}
else if(b == false)
{
    a += 5;
}
else
{
    exit(3);
}

Bạn có lẽ sẽ không bao giờ mong đợi để có boolđược không truehay false, tuy nhiên nó có thể xảy ra. Cá nhân tôi tin rằng đây là vấn đề gây ra bởi người quyết định làm điều gì đó lạ mắt, nhưng elsetuyên bố bổ sung có thể ngăn chặn bất kỳ vấn đề nào khác.


1

Tôi hiện đang làm việc với PHP. Tạo một biểu mẫu đăng ký và một hình thức đăng nhập. Tôi chỉ hoàn toàn sử dụng nếu và khác. Không có gì khác nếu hoặc bất cứ điều gì không cần thiết.

Nếu người dùng nhấp vào nút gửi -> nó sẽ chuyển sang câu lệnh if tiếp theo ... nếu tên người dùng ít hơn 'X' số lượng ký tự thì hãy cảnh báo. Nếu thành công thì kiểm tra độ dài mật khẩu và cứ thế.

Không cần thêm mã như người khác nếu điều đó có thể loại bỏ độ tin cậy đối với thời gian tải máy chủ để kiểm tra tất cả mã bổ sung.

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.