“ long long” =“ long long int” =“ long int ยาว” =“ int long long” หรือไม่


153

ฉันพบทั้งสองlong int longและint long longสามารถรวบรวมสำหรับประเภทตัวแปร มีความแตกต่างระหว่างlong int long, int long long, long longและlong long int?

โดยทั่วไปแล้วประเภทจะเหมือนกันหากมีจำนวนเท่ากันlong?

1 ยาว:

long l;
int long il;
long int li;

2 ยาว:

long long ll;
int long long ill;
long int long lil;
long long int lli;

และถ้าด้านบนถูกต้องการประกาศต่อไปนี้เหมือนกันหรือไม่

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;

8
ทดสอบ (แม้ว่าเฉพาะในคอมไพเลอร์ของคุณ) std::swapโดยใช้ สิ่งนี้จะไม่คอมไพล์ถ้าประเภทไม่เหมือนกัน
Bathsheba

1
ที่เกี่ยวข้อง: stackoverflow.com/questions/589575//
TobiMcNamobi

24
โหวตให้เปิดใหม่ สำเนาที่ถูกกล่าวหาเกี่ยวข้อง แต่ไม่ใช่คำถามนี้ คำตอบตรงนั้นไม่ตอบคำถามนี้ ผู้มีสิทธิ์ลงคะแนนใกล้เคียง: โปรดอย่าโหวตให้ปิดบนพื้นฐานของความไม่รู้
ไชโยและ hth - Alf


เปรียบเทียบ sizeof () แต่ละอันเพื่อให้แน่ใจ ความยาวที่ยาวควรเป็น 64 บิตดังนั้น sizeof (l) ควรเป็น 8 ถ้า sizeof (ill) == sizeof (lil) คอมไพเลอร์ของคุณจะเห็นพวกมันเหมือนกัน นี้จะเป็นจริงสำหรับคอมไพเลอร์ปัจจุบันของคุณและคอมไพเลอร์ในอนาคตใด ๆ ที่คุณอาจพบ (จนกระทั่งสวรรคตของ sizeof () - ซึ่งหวังว่าจะไม่เคยหรือฉันมีร้ายแรงปริมาณของการเขียนใหม่จะทำ)
Michael Stimson

คำตอบ:


136

ตามมาตรฐาน C ++ (7.1.6.2 ตัวระบุชนิดอย่างง่าย)

3 เมื่ออนุญาตตัวระบุชนิดง่ายหลายตัวพวกเขาสามารถผสมกับตัวระบุเดคอื่นได้อย่างอิสระในลำดับใดก็ได้

ตัวอย่างเช่นการประกาศต่อไปนี้ถูกต้อง

long static long const int x = 10;

คุณยังอาจจะใช้constexprระบุพร้อมกับconstรอบคัดเลือก ตัวอย่างเช่น

constexpr long static long const int x = 10;

อย่างไรก็ตามเราลืมเกี่ยวกับตัวระบุsigned! ลองเพิ่มมันตัวอย่างก่อนที่จะประกาศx

constexpr long static long const int signed x = 10;

ใน C คุณอาจใช้ตัวระบุประเภทหลายตัวในลำดับตัวระบุประกาศเดียวกัน ตามมาตรฐาน C (ตัวระบุประเภท 6.7.3)

5 หาก qualifier เดียวกันปรากฏมากกว่าหนึ่งครั้งใน specifier-qualifier-list เดียวกันไม่ว่าจะโดยตรงหรือผ่าน typedefs หนึ่งรายการหรือมากกว่าพฤติกรรมจะเหมือนกับว่ามันปรากฏเพียงครั้งเดียว ....

ตัวอย่างเช่นใน C การประกาศต่อไปนี้ก็ใช้ได้เช่นกัน

const long const long static const int const signed x = 10;

ดังนั้นหากคุณได้รับเงินตามจำนวนสัญลักษณ์ที่พิมพ์ในโปรแกรมฉันแนะนำให้คุณใช้การประกาศดังกล่าว :)


96
เมื่อคุณแน่นอนต้องแน่ใจว่าค่าจะไม่เปลี่ยนแปลง
Bob

3
@hvd น่าเสียดายที่ความคิดเห็นส่วนใหญ่ไม่รวมอยู่ในการคำนวณ
วลาดจากมอสโก

9
แม้ว่าเขียนเหมือน#define REM(...)และจากนั้นสำหรับตัวอย่างของการนับคำขนาดใหญ่i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.)?


15
คุณไม่ได้มีการผสมบ่น ... const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;รวบรวมเพียงแค่ปรับใน C :-)
ลูคัส Trzesniewski

111

เป็นประเภทที่เหมือนกัน ...

ใช่.

C ++ 11 §7.1.6.2 / 3

เมื่ออนุญาตให้ใช้ตัวระบุชนิดง่ายหลายตัวพวกเขาสามารถผสมกับตัวระบุเดคอื่นได้อย่างอิสระในลำดับใดก็ได้


2
ยิงตรง +1
einpoklum

42

ใช่ แต่โปรดทำไม่ได้ เช่นเดียวกับภาษาอังกฤษและภาษาเยอรมันที่มีคำสั่งทั่วไปสำหรับคำคุณศัพท์และคำวิเศษณ์ (เช่นเวลา - สถานที่ - สถานที่) ดังนั้นทำ C และ C ++ การเปลี่ยนแปลงจากคำสั่งทั่วไปจะไม่ทำให้คอมไพเลอร์สับสน แต่มันจะทำให้นักพัฒนาซอฟต์แวร์ของคุณสับสน ฉันอยากจะแนะนำว่าคำสั่งซื้อแบบดั้งเดิมนั้นอยู่ในแนวของ

  1. static/ extern(ลิงก์)
  2. const/ volatile(แก้ไข)
  3. signed/ unsigned(การเซ็นสัญญา)
  4. short/ long(ความยาว)
  5. ประเภทพื้นฐาน (คำนามหัว)

แม้ว่าจะมีบางห้องเลื้อยอย่างแน่นอน


29

“ long long” =“ long long int” =“ long int ยาว” =“ int long long” หรือไม่

คำตอบอื่น ๆ ทั้งหมดที่นี่พูดคุยเกี่ยวกับส่วนที่สองของคำถามของคุณ สำหรับส่วนแรก: “ long long” =“ long long int” หรือไม่ คำตอบคือใช่

C ++ 11 7.1.6.2 ตัวระบุชนิดง่าย (ตาราง 10)

Specifier(s)            Type
...                     ...
long long int           long long int
long long               long long int
long int                long int
long                    long int  
...                     ...  

สำหรับคำถามที่สองของคุณ: “ long int long” =“ int long long” หรือไม่ คำตอบคือใช่อีกครั้ง

ตัวระบุชนิดอาจเกิดขึ้นในลำดับใดก็ได้และสามารถผสมกับตัวระบุการประกาศอื่น ๆ ได้ ดังนั้นทั้งหมดต่อไปนี้

long long  
long long int  
long int long  
int long long  

ถูกต้องและเทียบเท่า


3
ฉันไม่เข้าใจว่าทำไมคุณไม่ปรับปรุง @Cheers และ hth - คำตอบของ Alf แทน
เซบาสเตียนมัค

8
@phresnel; เพราะคำตอบอื่น ๆ ทั้งหมดครอบคลุมเพียงครึ่งเดียว ทุกคนพูดถึงการผสมผสานของตัวระบุรูปแบบที่หายไปในช่วงครึ่งแรกของคำถามในชื่อ: “ long long” =“ long long int” =“ long int long long” =“ int long long” หรือไม่
haccks

5
@phresnel บางคนตอบรับสิ่งจูงใจเพื่อรับตัวแทน การแก้ไขคำตอบของคนอื่นเพื่อให้ครอบคลุมอีกครึ่งหนึ่งคำตอบคืองานจำนวนมากที่ให้เครดิตกับคนอื่นได้อย่างมีประสิทธิภาพ

1
จริง ในตอนแรกสิ่งนี้ดูเหมือนจะเป็นเพียงส่วนเสริมเล็กน้อย (CC: @Thebluefish)
เซบาสเตียนมัค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.