Kezdőoldal » Számítástechnika » Programozás » C++-ban a sztringliteráloknak...

C++-ban a sztringliteráloknak mi a pontos típusa? Const char [karakterszám+1] vagy const char *?

Figyelt kérdés

2018. jan. 14. 21:10
1 2
 1/12 anonim ***** válasza:
2018. jan. 14. 21:13
Hasznos számodra ez a válasz?
 2/12 A kérdező kommentje:
Tehát const char [karakterszám+1].
2018. jan. 15. 13:50
 3/12 anonim ***** válasza:

"Const char [karakterszám+1] vagy const char *"


Az a vicces, hogy a kettő kb. ugyanaz, vagyis char elemű tömbre mutató pointer (vagy referencia). A sztring maga egy tömb, de a forráskódban pointerként jelenik meg.

2018. jan. 15. 16:42
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:

A pontos típusa const char[N+1] ahol N a karakterek száma, a +1 meg a \0.


#include <iostream>


template<std::size_t N>

void print_length(const char(&)[N])

{

std::cout << N << '\n';

}


int main()

{

const char str[] = "Hello World!";

print_length(str);

}

2018. jan. 16. 02:38
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:

"A pontos típusa const char[N+1]"


Nem kötözködésképpen, de ilyen típus nincs.

Pl. ezek csak a generált kódban térnek el, amúgy ugyanaz a típusuk:

const char str[8] = "abc";

const char str[128] = "abc";

const char str[] = "abc";

const char * str = "abc";

2018. jan. 16. 03:00
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:

"Nem kötözködésképpen, de ilyen típus nincs."

Pedig van.


"Pl. ezek csak a generált kódban térnek el, amúgy ugyanaz a típusuk:"

A felsoroltak közül mindegyiknek eltérő a típusa.

2018. jan. 17. 03:36
Hasznos számodra ez a válasz?
 7/12 anonim ***** válasza:

Akkor miért helyes mindegyik, pedig a jobbértékek mind azonosak. :)

ELemszámban persze különbözhetnek, a sizeof is képes felismerni őket, de az más történet.


Az alábbi két kifejezés pl. teljesen egyenértékű, függetlenül attól, hogy az 'a' hogyan lett deklarálva:

*(a+2)

a[2]

2018. jan. 17. 05:29
Hasznos számodra ez a válasz?
 8/12 anonim ***** válasza:

"Akkor miért helyes mindegyik, pedig a jobbértékek mind azonosak. :)"

Ezen logikád alapján.

int i = 5;

float f = 5;

double d = 5;


"ELemszámban persze különbözhetnek, a sizeof is képes felismerni őket, de az más történet."

Mivel az elemszám a típus része ezért annyira nem más történet.


"Az alábbi két kifejezés pl. teljesen egyenértékű, függetlenül attól, hogy az 'a' hogyan lett deklarálva:"

Ez miatt nem lesz azonos a típusuk, a *(a+2) azért működik mert:

"An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion (7.4) is applied. The result is a pointer to the first element of the array."


Az pedig nem meglepő, hogy teljesen egyenértékű, definíció szerint az:

"The expression E1[E2] is identical (by definition) to *((E1)+(E2))"

2018. jan. 17. 17:18
Hasznos számodra ez a válasz?
 9/12 anonim ***** válasza:
100%

Ezek szerint a sztring literálok a hosszuktól függően más-más típusúak? :D


Kicsit szezon és fazon jellegű lenne ez a vita...

2018. jan. 18. 02:45
Hasznos számodra ez a válasz?
 10/12 anonim ***** válasza:

Az int/float.. példád jogosnak látszik, de ott implicit típuskonverzió működik, azok konkrétan különböző módon tárolják azt a számot. A sztringet egy pointer fogja reprezentálni a kódban, maga a memóriatömb (x bájtnyi összefüggő terület) egy másik történet. És igen, definíció szerint, az a lényeg.

Asszem léptem...

2018. jan. 18. 02:53
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!