많은 언어에서 할당은 조건에서 합법적입니다. 나는 그 이유를 결코 이해하지 못했습니다. 왜 다음과 같이 작성 하시겠습니까?
if (var1 = var2) {
...
}
대신에:
var1 = var2;
if (var1) {
...
}
답변:
if 문보다 루프에 더 유용합니다.
while( var = GetNext() )
{
...do something with var
}
그렇지 않으면 작성해야 할
var = GetNext();
while( var )
{
...do something
var = GetNext();
}
종종 오류 감지 등과 관련된 일련의 작업에서 가장 유용하다고 생각합니다.
if ((rc = first_check(arg1, arg2)) != 0)
{
report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
대안 (조건에서 할당을 사용하지 않음)은 다음과 같습니다.
rc = first_check(arg1, arg2);
if (rc != 0)
{
report error based on rc
}
else
{
rc = second_check(arg2, arg3);
if (rc != 0)
{
report error based on new rc
}
else
{
rc = third_check(arg3, arg4);
if (rc != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
}
}
장기간의 오류 검사를 사용하면 대안은 페이지의 RHS를 벗어날 수 있지만 조건부 할당 버전은 그렇게하지 않습니다.
오류 검사는 단순히 검사가 아닌 '작업'( first_action()
,,) second_action()
일 수도 있습니다 third_action()
. 즉, 기능이 관리하는 프로세스의 단계를 확인할 수 있습니다. (대부분 내가 작업하는 코드에서 함수는 사전 조건 검사 줄이나 함수가 작동하는 데 필요한 메모리 할당 또는 유사한 줄을 따라 있습니다).
함수를 호출하는 경우 더 유용합니다.
if (n = foo())
{
/* foo returned a non-zero value, do something with the return value */
} else {
/* foo returned zero, do something else */
}
물론, n = foo (); 별도의 진술에서 if (n), 그러나 위의 내용은 상당히 읽기 쉬운 관용구라고 생각합니다.
GCC는 실수로 과제를 진실 값으로 사용하려고 시도하는 경우 (-Wall 사용) 감지하는 데 도움이 될 수 있습니다.
if ((n = foo())) {
...
}
즉, 추가 괄호를 사용하여 이것이 실제로 원하는 것임을 나타냅니다.
관용구는 문 while
대신 루프를 작성할 때 더 유용 if
합니다. 를 들어 if
당신이 설명하는대로 문, 당신은 그것을 분리 할 수 있습니다. 그러나이 구조가 없으면 자신을 반복해야합니다.
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
또는 loop-and-a-half 구조를 사용하십시오.
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
나는 일반적으로 루프 앤 하프 형식을 선호합니다.
while
루프를 사용하여 선호 :do { c = getchar(); ... } while (c != EOF);
for
루프를 대신 사용할 수 있습니다 .-- for (char c = getchar(); c != EOF; c= getchar()) { /* do something with c */ }
이것은 가장 간결하며 for
항상 스타일 적으로 '루프'라고 말합니다. 작은 단점은 c
두 번 반환하는 함수를 지정해야한다는 것 입니다.
짧은 대답은 표현식 지향 프로그래밍 언어가 더 간결한 코드를 허용 한다는 것입니다 . 명령을 쿼리에서 분리 하도록 강요하지 않습니다 .
예를 들어 PHP에서는 SQL 데이터베이스 결과를 반복하는 데 유용합니다.
while ($row = mysql_fetch_assoc($result)) {
// Display row
}
이것은 다음보다 훨씬 나아 보입니다.
$row = mysql_fetch_assoc($result);
while ($row) {
// Display row
$row = mysql_fetch_assoc($result);
}
다른 이점은 gdb를 사용하는 동안 발생합니다. 다음 코드에서 오류 코드는 단일 단계를 수행했는지 알 수 없습니다.
while (checkstatus() != -1) {
// process
}
차라리
while (true) {
int error = checkstatus();
if (error != -1)
// process
else
//fail
}
이제 단일 단계에서 checkstatus ()에서 반환 오류 코드가 무엇인지 알 수 있습니다.
선택 사항을 반환하는 함수 ( boost::optional
또는 std::optional
C ++ 17)에서 매우 유용합니다 .
std::optional<int> maybe_int(); // function maybe returns an int
if (auto i = maybe_int()) {
use_int(*i);
}
이것은 내 변수의 범위를 줄이고 코드를 더 간결하게 만들고 가독성을 방해하지 않습니다.
포인터와 동일 :
int* ptr_int();
if (int* i = ptr_int()) {
use_int(*i);
}
그 이유는:
성능 향상 (가끔)
적은 코드 (항상)
방법이있다 : 예를 가지고 someMethod()
와에 if
조건 당신은 메서드의 반환 값이 있는지 여부를 확인하려면 null
. 그렇지 않은 경우 반환 값을 다시 사용합니다.
If(null != someMethod()){
String s = someMethod();
......
//Use s
}
동일한 메서드를 두 번 호출하므로 성능이 저하됩니다. 대신 다음을 사용하십시오.
String s;
If(null != (s = someMethod())) {
......
//Use s
}