문제

while (curr_data[1] != (unsigned int)NULL &&
    ((curr_ptr = (void*)curr_data[1]) || 1))

두 부분 질문.

무엇을 할 것인가 (curr_ptr = (void*)curr_data[1]) 논리적으로 평가하십시오. TRUE?

또한, 나는 그것의 오히려 해킹을 알고 있지만 while 성명서 법적 C? 나는 코드의 다른 곳에 과제를 배치하기 위해 큰 콘텐츠를 거쳐야 할 것이므로, 나는 그것을 거기에두면 정말 좋을 것입니다. 그러나 그것이 너무 심각하다면 모든 사람의 안구가 화염에 빠지게 만들면 변경하겠습니다. .

도움이 되었습니까?

해결책

질문에 답하기 위해 :

  1. 그것은 진짜 if로 평가할 것입니다 curr_ptr 설정되지 않았습니다 NULL (즉 curr_data[1] 0).
  2. 나는 그것이 합법적이라고 생각하지만이 코드 라인에는 더 큰 문제가 있습니다.

어쨌든, 나는 당신 이이 코드를 작성하지 않았다고 가정합니다. 왜냐하면 당신은 그것을 남겨 두는 것에 대해 토론하기 때문입니다. 그래서 나는 당신이 누가이 코드 라인을 썼는지 알아 내고 무거운 무딘 물체를 소개하기를 바랍니다.

  1. (unsigned int)NULL 말도 안 돼요. 왜 이렇게 하시겠습니까? 이것은 아마도 글쓰기와 동일 할 것입니다 0 (표준에 의해 보장되는지 확실하지 않음).
  2. 어떤 종류의 데이터가 있습니다 curr_data[1] 포인터에 캐스트되고 있다면 (그리고 포인터가 캐스트되고 있습니다)? 포인터를 적분 유형으로 고정 해야하는 경우 유형을 사용해야합니다. intptr_t 또는 uintptr_t 제공됩니다 <stdint.h> 그 목적으로 (컴파일러가 C99를 지원하지 않는 경우 ptrdiff_t 허용 가능한 대체물 일 수 있습니다).
  3. 그만큼 || 1 결국 중복되는 것 같습니다. 만약에 curr_ptr = (void*)curr_data[1] 거짓으로 평가했을 것입니다. 우리는 첫 번째 조건에서 그것을 잡았을 것입니다.

그것은 엉덩이의 고통 일지 모르지만이 라인을 다시 작성하는 것을 심각하게 재고합니다. IOCCC의 항목처럼 보입니다.

다른 팁

(curr_ptr = (void*)curr_data[1]) 널 포인터가 아닌 한 TRUE를 평가합니다.

그것을 가정합니다 curr_data 포인터의 배열이며, 당신이하고 싶은 것은이 포인터의 두 번째가 널이 아닌 반면, 값을 할당하는 동안 루프를 실행하는 것입니다. curr_ptr, 나는 할것이다:

while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }

과제는 C의 표현식이므로 작동하는 것은 작동합니다. 변경 ; 에게 {} 똑같은 것을 의미하고 훨씬 더 명확합니다. 최소한 변경을 수행하십시오. 더 명확한 대안이있을 때 조건의 과제를 피해야하지만 (일반적으로 사실),이 장소에서 가장 명확한 경우 사용하십시오.

과제의 결과는 할당 된 대상입니다. a = value 과제를 수행 한 다음 평가합니다 a. 이것은 같은 일을하는 데 사용됩니다 a = b = 0.

코드를 더욱 정리하려면 공허 캐스트가 필요하지 않으며, chars 인 경우 널 (포인터 만 사용해야 함) 대신 ' 0'(널 문자)을 사용하십시오.

당신은 "위대한 연소"를 통과 할 필요가 없습니다. 그것은 완전히 동등합니다.

while (curr_data[1]) {
    curr_ptr = (void *)curr_data[1];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top