LINUX.ORG.RU

присвоение внутри if

 


0

3

Зачем в языках программирования, например с Си и прочих, которые унаследовали его синтаксис есть возможность написать if (a=b). Вернет же всегда присвоение истину. Можете привести пример зачем это нужно? Попросили объяснить почему компилятор сам не понимает когда надо == а когда =. Не смог.

Перемещено JB из talks

если b==0, то (a=b)==false

qbe
()

«We do what we must because we can.» (c)

Погромист должен быть немного умнее конпелятора.

Deleted
()

В С слабенькая типизация, булевый тип ввели только в C99. Надо было изначально делать булевый тип, а не использовать числа вместо него.

encyrtid ★★★★★
()
Ответ на: комментарий от flareguner

Чтобы не возникало путаницы и люди думали головой. Это тебе не Php.

Петросян Мистер Бин.

VirRaa ★★★
()

Чтобы например можно было сделать так:

open (FILE,'test.txt');
if ($a = <FILE>) {
 print $a;
}else{
 print "Empty file";
}
kranky ★★★★★
()
Ответ на: комментарий от sdbrother

Чтоб запутать вероятного противника.

Deleted
()

if (a=b). Вернет же всегда присвоение истину

Здесь твоя неправда.

Raving_Zealot ★★
()

Вернет же всегда присвоение истину

Не истину, а по значению присваивания.

Зачем?

Чтобы на строчку меньше писать.

KRoN73 ★★★★★
()
Ответ на: комментарий от sdbrother

Тем, что первое выглядит стройнее и красивее.

buddhist ★★★★★
()

Пользуюсь таким. Правда, gcc ругается на такое, поэтому приходится оформлять в скобки.

Можете привести пример зачем это нужно?

Для укорачивания записей. Например, вместо

a = b;
if(b != NULL){ …
пишем
if( (a = b) ){ … 

Eddy_Em ☆☆☆☆☆
()

это фича языка :)

Harald ★★★★★
()

В с++ (может и в си) внутри условия if можно объявить локальную переменную.

if(int something=<expression>)
 print(factorial(something));
else
 print("Shit happens");
staseg ★★★★★
()

if( file=fopen(...) ){ ... } else{ std::cout << 'ахтунг, файл сперли!' exit(0); }

soomrack ★★★★
()
Ответ на: комментарий от anonymous

Это точно: лучше еще дополнительные скобки поставить.

Eddy_Em ☆☆☆☆☆
()

Это такие уродские хаки для языков без метапрограммирования.

В нормальных языках можно так сделать:

(aif (get-something)
  (print it)
  (print "error"))
anonymous
()

зачем это нужно?

чтобы не было пипеца как в питоне когда несколько последовательных if else if превращается в лесенку:

x = f1()
if x:
    pass
else:
    x = f2()
    if x:
       ...
true_admin ★★★★★
()

Вернет же всегда присвоение истину

Оно вернёт операнд присвоения. А дальше уж как повезёт.

А вообще, почему нет? Присвоение такой же оператор как и остальные, ничто не запрещает ему быть внутри конструкции условия. Проблема тут в невниательности и быдлокоде.

Kalashnikov ★★★
()

Дык меньше кода:

if ( my ( $first, $second ) = $regexp ) { say join q{, }, $first, $second; }

outtaspace ★★★
()
Ответ на: комментарий от Kalashnikov

неее, речь не идёт о присвоении, речь идёт о том что если f1() вернула true то делаем одно, если false то другое. А у тебя просто присвоение x первого is True значения.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Эээ, а как это будет на крестах без лестницы?

zz ★★★★
()
Ответ на: комментарий от true_admin

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

if f1():
	# Делаем одно
elif f2():
	# Делаем другое
else:
	# Ничего не делаем

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

очевидно же, чтобы можно было утверждать, что «питон ненужен»

opsik
()

ты бы ещё про такое спросил.


i = 3
while (a *=2, i--);

nanoolinux ★★★★
()
Ответ на: комментарий от sdbrother

r = getSometimng(); if(r > x) { }

Лишние строки :-) Вообще код вида

int err;
if ((err = open(...)) < 0) { ... }
if ((err = read(...)) < 0) { ... }
if ((err = write(...)) < 0) { ... }

для С идиоматичен.

Для С++ есть важное применение (я ни в коей мере не пропагандирую использование dynamic_cast):

if (Foo* x = dynamic_cast<Foo*>(y)) {
  // Переменная x видна только в этом блоке.
}
Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

Наверное, тезка имел ввиду что то типа:

(println (or (get-something) «error»))

Только зачем тут метапрограммировать то?

anonymous
()

Эту фичу удобно использовать с while при чтении ввода с клавиатуры, например. Чтоб не писать в теле цикла что-то вроде if not foo: break.

pevzi ★★★★★
()

while (p != NULL && ((p = p->next) != NULL)) {

note173 ★★★★★
()
Ответ на: комментарий от quantum-troll

макрокостылях

Нет, макросы в Лиспе - полноценная возможность языка, самая важная.

Можно, но какой смысл в подобных макрокостылях?

Подобным образом можно создавать любые абстракции.

Кстати, лиспы уже умеют maybe?

Что значит «уже»? Берешь да делаешь? Это же Лисп.

anonymous
()
Ответ на: комментарий от anonymous

Только зачем тут метапрограммировать то?

print там для примера. С it дальше можно работать.

anonymous
()

это ещё что! недавно узнал, что в пхп можно так:

if(!$a=foo());

drBatty ★★
()
Ответ на: комментарий от anonymous

Не люблю такие неочевидные вещи в макросах. Я пишу так:

(if-let (x (something))
 (print x)
 (print "Error"))

Писать чуть-чуть побольше, зато всегда очевидно, что это за переменная, какова ее облать видимости, плюс возможность полноценной работы со вложенными if-let конструкциями.

staseg ★★★★★
()
Ответ на: комментарий от belous_k_a

Мне посещает мысль что это придумали начальники оплачивающие строчки кода, очевидно так код выходит дешевле.

if
 (
  x
  =
  foo()
 )
;
drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.