avva: (Default)
[personal profile] avva
Гуляя по исходникам ядра Линукса в поисках информации о том, как в нём устроены real-time signals (см. 'man 7 signal', если вы не знаете, что это такое), я обнаружил случайно весьма удивительную конструкцию в C:

Оператор условного выбора ?:, но без второго операнда. То есть вместо обычного, скажем,

a = b ? c : d;

(что означает: если b, то присвоить a=c; иначе присвоить a=d), пишется, например, так:

a = b ? : d;

По контексту становится ясно, что это означает: если b, то a=b; иначе a=d.

(кстати, весьма неинтуитивно; самым очевидным кажется такая интерпретация: если b, то a не меняется, иначе a=d. Но, конечно, на самом деле такая интерпретация невозможна, т.к. согласно семантике языка выражение (b ? : d) должно иметь какое-то определённое значение)

Так вот, я такого никогда в жизни не видел, и не подозревал даже, что так можно писать. Теперь мне интересно, это разрешено каким-то стандартом, или это какое-то расширение gcc? Знает ли кто?

Пример "живого" использования в исходнике ядра Линукса см. например в файле net/ipv4/tcp.c, там их шесть штук (в 2.4.20 по крайней мере). Например:

val = (tp->keepalive_time ? : sysctl_tcp_keepalive_time)/HZ;

Re: программистское: C, Unix

Date: 2003-09-30 12:21 pm (UTC)
From: [identity profile] dvv.livejournal.com
Хм? Мне потребовалось заглянуть в стандарт чтобы привести цитату, chapter и verse, что никак не говорит о моём немедленном знании или незнании сути данного конкретного вопроса. Что же касается моего стиля кодирования, так я стараюсь, чтобы он был максимально прозрачным и однозначным даже для кодеров с весьма общим представлением о языке, чтобы у любителей гадать о моих намерениях было как можно меньше материала для их любимого занятия.

Re: программистское: C, Unix

Date: 2003-09-30 12:27 pm (UTC)
From: [identity profile] arbat.livejournal.com
Вы хотите сказать, что были абсолютно, на 100% - уверены, что нету никаких проблем? :-)



Re: программистское: C, Unix

Date: 2003-09-30 12:31 pm (UTC)
From: [identity profile] dvv.livejournal.com
Я хочу сказать, что я абсолютно, на 100% был уверен, что с точки зрения языка никаких проблем в примере не было.

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 02:44 pm
Powered by Dreamwidth Studios