Literal etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Literal etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Aralık 2020 Pazartesi

Integral Literals

Single Quote İle Okumayı Kolaylaştırmak
C++14'ten itibaren sayıları okumayı kolaylaştırmak için apostrof kullanılabilir.
Örnek
Şöyle yaparız.
int LargeNumber = 1'000'000;
Şöyle yaparız.
int i = 1'000'000'000;
C++ ve C# gibi dillerde short için literal eki mevcut değil. En küçük literal eki int.

Eğer integral sayılar için literal eki kullanılmazsa, int'ten küçük olmamak kaydıyla derleyici sayının sığdığı en küçük int tipi seçer. Örneğin long gibi. Şimdi literal eklerinin detaylarına bakalım.

Integer Literal
Bir öneriyle yeni integer literal ön ekleri teklif edildi. Teklif şöyle

1 int
Bir ek koymaya gerek yok.
auto a = 4 ; // int
2 unsinged int - U eki
Şöyle yaparız.
auto b = 4U ; // unsigned int
3 long int - L eki
Şöyle yaparız.
auto c = 4L ; // long int
4 unsigned long int - UL eki veya LU
Örnek
Şöyle yaparız.
auto foo = 12ul;
Örnek
Şöyle yaparız.
75         // int
75u        // unsigned int
75l        // long
75ul       // unsigned long 
75lu       // unsigned long

3.14159L   // long double
6.02e23f   // float  
5 unsigned long long - ULL
en az 64 bit olan unsigned long long.
Örnek - Atama
Şöyle yaparız.
uint64_t x = 1000000000ull;
Örnek - Bit Shit
Bit kaydırma işlemlerinde şöyle yapmak gerekir.
uint64_t x2 = (1ull << 35ull);
Aynı sonucu şöyle de elde edebiliriz.
auto x = std::uint64_t(1) << 35;
Ayrıca stdint.h dosyasında tanımlı olan UINT64_C macrosu da kullanılabilir.

Örnek - Çarpma
Şöyle yaparız. İlk satırda en baştaki sabitin LL olması yeterli. LL tipi çarpı int tip her zaman LL tipinden çıktı verir
long long int n = 2000LL*2000*2000*2000;
long long int n = 2000LL*2000LL*2000LL*2000LL;

6 float - f
Şöyle yaparız
6.02e23f   // float
int_64_t
Aslında bu bir user defined literal ancak yine de not almak istedim
Örnek
Şöyle yaparız
constexpr std::int64_t operator "" _int64(unsigned long long v)
{ return static_cast<std::int64_t>(v); }

19 Eylül 2019 Perşembe

Literal - Aynen Kullanılan Anlamına Gelir

Literal Nedir?
Literal aynen kullanılan değer anlamına gelir. Programlama dillerinde integerkayan noktastring gibi koda yazılan değerin işlemden geçmeden kelimesi kelimesine kullanılması için vardır.

C++ standardında <chrono>, <complex> ve <string> header'ları literal'ları tanımlıyor.

chrono içinde h,min,s,ms,us,ns ekleri var.
complex içinde i, il, if ekleri var.
string içinde s eki var.


1. Karakter/String Literal 
Ön Ekler
C++'ta sayısal literal ekleri sona yazılır. Karakter literal önekleri ise başa yazılır. Karakter literal ekleri R, u8, u8R,  u, uR, U, UR, L veya LR olabilir.

u8 - utf-8
u8 Literal yazısına taşıdım.
u - utf-16
char16_t* döndürür. Şöyle yaparız.
const char16_t* utf16string = u"\xD83D\xDE01";
U - utf-32
char32_t* döndürür. Şöyle yaparız.
const char32_t* utf32string = U"\x0001F601";

Son Ekler
s eki
String Literal s yazısına taşıdım.

Escape Sequence Karakterleri
String Literal ve Escape Sequence yazısına taşıdım.

2. Raw String Literal
Raw String Literal yazısına taşıdım.

3. Binary Literal
Yeni C++ ile bazı sayıları hex sabitler gibi yazmak yerine ikilik halini kullanmak mümkün.
unsigned int mask = 0b0111;

4. Integral Ekleri
Integral Literals yazısına taşıdım

5. User Defined Literal
User Defined Literal yazısına taşıdım.

1 Temmuz 2019 Pazartesi

u8 Literal - String İçin UTF-8 Literal

Giriş
u8 literal utf-8 içindir.

Döndürdüğü Tip
char* veya char8_t* döndürür.

Örnek
Şu kod string literal'ı std:string'e atamaya çalıştığı için derlenmez
std::string myString = u8"●";
Şöyle yaparız.
const std::u8string str = u8"●";
Örnek
u8 bir macro olarak tanımlı olabilir. Şöyle yaparız.
#define u8 "abc"
const char *s = u8"def";  // Previously "abcdef", now "def"
Örnek
utf8 string literal'ları Linux'ta ekrana basmakta sorun yok ancak Windows'ta sorun çıkıyor
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
Şöyle yaparız.
const char *c = u8"£";
Şöyle yaparız.
std::cout << u8"I'm wrong.";
Örnek - \u
Açıklaması şöyle.
\u is not for UTF-16 or any other encoding. Escape sequences like \u and \U are encoding-agnostic. They only specify the code point.
Yani \u ile codepoint belirtilir. Şöyle yaparız.
const char *c = u8"\u00A3"; // "£"
Şöyle yaparız.
cout << u8"\u0061\u0928\u093F\u4E9C\U00010083" << endl;
Örnek -  \x
Bu kullanımda direkt byte'ları veriyoruz. Şöyle yaparız. Bu durumda u8 kullanmanın ne anlamı var bilmiyorum.
const char* utf8string = u8"\xF0\x9F\x98\x81";
Diğer
Eğer u8 yoksa, utf8 byte'ları \x yani hexadecimal olarak teker teker yazarız.

Örnek
Şöyle yaparız.
std::string str="\xc2\xb1";
std::cout << str;
Çıktı olarak şunu alırız.
±

9 Nisan 2018 Pazartesi

String Literal ve Escape Sequence

Escape Sequence Karakterleri
String Literal kullanırken escape sequence karakterlerini bilmek gerekir. Karakterler ve nasıl escape edildikleri şöyle.
new-line         NL(LF) \n
horizontal tab   HT     \t
vertical tab     VT     \v
backspace        BS     \b
carriage return  CR     \r
form feed        FF     \f
alert            BEL    \a
backslash        \      \\
question mark    ?      \?
single quote           \’
double quote     "      \"
octal number     ooo    \ooo
hex number       hhh    \xhhh

Hexadecimal
Literal içinde hexadecimal sayı kullanmak isteyebiliriz. n tane hexadecimal escape sequence arka arkaya gelebilir.
hexadecimal-escape-sequence:
    \x hexadecimal-digit
    hexadecimal-escape-sequence hexadecimal-digit

Örnek
Şöyle yaparız.
char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00
char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00
Eğer \x12'den sonra normal bir karakter daha eklemek istersek şöyle yaparız.
char problem[] = "abc\x12" "e";
Daha okunaklı olsun istersek şöyle yaparız.
char problem[] = "abc" "\x12" "e";
Octal
Octal escape sequence içinde 3 tane rakam olabilir
octal-escape-sequence:
    \ octal-digit
    \ octal-digit octal-digit
    \ octal-digit octal-digit octal-digit
Şöyle yaparız.
char problem[] = "abc\022e";
İstisnalar
String içinde bir tek single quote biraz farklılaşabilir. Açıklaması şöyle
Escape sequences and universal-character-names in non-raw string literals have the same meaning as in character literals (2.14.3), except that the single quote ’ is representable either by itself or by the escape sequence \’
Yani şu iki kod parçası aynı şeydir.
int main()
{
    char* str1 = "Tom's cat";
    char* str2 = "Tom\'s cat";
}
Ancak literal karakter ise escape sequence kullanmak gerekir.
char x = '\'';