2016-02-01 5 views
-1

Извините. Эта проблема вызвана моей неосторожностью. Пожалуйста, проигнорируйте ее, спасибо.В C++ условный оператор не поддерживал указатель?

Я пытаюсь решить проблему сообщения на LintCode, Add Two Numbers.
Во-первых, я пробую эти коды: first_code, но я получил Runtime Error и сообщение об ошибке TERMSIG = 11.
Затем я меняю коды на них, second_code. К моему удивлению, это сработало.
Единственное отличие состоит в:
[Первая]

l1 = (l1) ? nullptr : l1->next; 
l2 = (l2) ? nullptr : l2->next; 

[Второй]

if(l1){ 
    l1 = l1->next; 
} 
else{ 
    l1=nullptr; 
} 
if(l2){ 
    l2 = l2->next; 
} 
else{ 
    l2=nullptr; 
} 

Так интересно ли указатель условной поддержки оператора или нет?
Стараюсь эти простые коды:

#include <iostream> 
int main(){ 
    int* a = nullptr; 
    int b = 0; 
    b = (a) ? 1 : 10; 
    std::cout << b << std::endl; 
} 

Он работал.
Но почему это не удалось решить проблему на LintCode. Я ничего не забыл?

+3

В вашей второй строке 'l1 = (l2)? nullptr: l2-> next; 'вы хотели назначить' l2'? – CoryKramer

+0

[Первый] по-прежнему не эквивалентен [Second]. [Первый] должен быть 'l1 = (l1)? l1-> next: nullptr; 'или' l1 = (! l1)? nullptr: l1-> next; ' – LogicStuff

+0

Взгляните на [Тернарный условный оператор] (http://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator). – LogicStuff

ответ

1

Две части кода делают разные вещи.

Первый имеет две ошибки. Во-первых, вы не назначаете l2 вообще. Во-вторых, вы разыскиваете указатель, если он равен нулю. Во второй версии эти ошибки отсутствуют.

Вы, кажется, путаетесь о порядке операндов условного оператора. Выражение второго операнда выполняется, если первый операнд равен true, а третий операнд выполняется, если первый - false.

Так что я задаюсь вопросом, является ли указатель поддержки условного оператора или нет?

Он делает. Вы просто не можете разыменовывать нулевой указатель.

2
l1 = (l1) ? nullptr : l1->next; 

эквивалентно

if (l1) 
    l1 = nullptr; 
else 
    l1 = l1->next; 

Проблема должна быть очевидна.

Многие люди предпочли бы, чтобы пропустить альтернативную ветвь полностью,

if (l1) 
    l1 = l1->next; 

как назначение nullptr к нулевому указателю ненужно (и похоже, что-то еще было предназначено).

 Смежные вопросы

  • Нет связанных вопросов^_^