Pytania otagowane jako language-lawyer

W przypadku pytań dotyczących zawiłości formalnych lub autorytatywnych specyfikacji języków programowania i środowisk.


7
Czy mogę użyć NULL jako podstawienia wartości 0?
Czy mogę używać NULLwskaźnika jako zamiennika wartości 0? Czy jest w tym coś złego? Jak na przykład: int i = NULL; jako zamiennik dla: int i = 0; W ramach eksperymentu skompilowałem następujący kod: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } Wynik: 0 Rzeczywiście …


3
std :: vector (ab) używa automatycznego przechowywania
Rozważ następujący fragment kodu: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } Oczywiście ulegnie awarii na większości platform, ponieważ domyślny rozmiar stosu jest zwykle mniejszy niż 20 MB. Teraz rozważ następujący kod: #include <array> #include <vector> int main() { using huge_type = std::array<char, 20*1024*1024>; std::vector<huge_type> …


3
Deklaracja C ++ i nawiasy - dlaczego?
Temat był wcześniej omawiany , ale to nie jest duplikat. Kiedy ktoś pyta o różnicę między decltype(a)i decltype((a)), jak zwykle odpowiedź brzmi - ajest to zmienna, (a)jest wyrazem. Uważam tę odpowiedź za niezadowalającą. Po pierwsze, ajest to także wyrażenie. Opcje wyrażenia podstawowego obejmują między innymi: ( wyrażenie ) wyrażenie id …

6
Jaki jest prawidłowy sposób konwersji 2 bajtów na 16-bitową liczbę całkowitą ze znakiem?
W tej odpowiedzi , Zwol wykonane tego twierdzenia: Prawidłowym sposobem konwersji dwóch bajtów danych ze źródła zewnętrznego na 16-bitową liczbę całkowitą ze znakiem jest użycie funkcji pomocniczych takich jak to: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) …

2
Dlaczego gramatyka BNF języka C dopuszcza deklaracje z pustą sekwencją deklaratorów init?
Przeglądając gramatykę BNF języka C, pomyślałem, że to dziwne, że reguła produkcyjna deklaracji wygląda tak (zgodnie z https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20 Backus-Naur% 20form.htm ): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; Po co używać *kwantyfikatora (co oznacza zero lub więcej wystąpień) dla init-declarator? Dzięki temu instrukcje takie jak int;lub void;mogą być poprawne …





3
Czy można zwracać domyślną wartość argumentu przez stałe odniesienie?
Czy można zwracać domyślną wartość argumentu przez odwołanie do stałej, jak w poniższych przykładach: https://coliru.stacked-crooked.com/a/ff76e060a007723b #include <string> const std::string& foo(const std::string& s = std::string("")) { return s; } int main() { const std::string& s1 = foo(); std::string s2 = foo(); const std::string& s3 = foo("s"); std::string s4 = foo("s"); }


3
Czy kompilator może stale składać zmienną lokalną?
Rozważ ten prosty kod: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 Widać, że ani gccnie clangoptymalizuje potencjalnego połączenia z g. W moim rozumieniu jest to poprawne: maszyna abstrakcyjna ma zakładać, że volatilezmienne mogą się zmieniać w dowolnym momencie (z powodu np. Mapowania …

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.