Відмінність між C та C++

Серпень 28th, 2008

Я до цього часу вважав, що C++ є розширенням C. Ну, насправді, я розумію, що це абсолютно різні мови, з різними сферами застосування і т.д. і блаблабла… Але от була така впевненість, що формально нема в C нічого такого, чого б не було C++. Тобто, я вважав, що сертифікований компілятор C++ має без будь-яких зауважень скомпілювати C-програму. А от ні, виявляється, є одна штука, якою ці мови відрізняються. Хоча, звісно, це така, дуже теоретична відмінність, наврядчи хтось може з цим зіткнутися в реальному житті.

Відмінність демонструється ось такою програмою:
#include <stdio.h>
int main(){
int b = sizeof('b');
if(b==4) printf("I'm a C program!\n");
else printf("I'm a C++ program!\n");
return 0;
}

У повній відповідності до тексту, скомпільований з опцією “gcc -x c” виконуваний файл гордо заявляє про своє чистокровне c-походження, а при “gcc -x cpp” чесно визнає свою плюсонутість.

Між іншим, не обов’язково визначати розмір саме 'b', підійде й будь-який інший символ. Але розгадка саме в цьому — у різному трактуванні послідовності символів в одинарних лапках. Це називаєтся character constant, і ось що про неї написано у стандарті мови C:

6.4.4.4 Character constants
Syntax
character-constant:
‘ c-char-sequence ‘
L’ c-char-sequence ‘
c-char-sequence:
c-char
c-char-sequence c-char
c-char:
any member of the source character set except
the single-quote ‘, backslash \, or new-line character
escape-sequence

An integer character constant has type int. The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer. The value of an integer character constant containing more than one character (e.g., ‘ab’), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined. ….

Стандарт C++ містить схоже визначення, але більш заплутане:

2.13.2 Character literals
character-literal:
’c-char-sequence’
L’c-char-sequence’
c-char-sequence:
c-char
c-char-sequence c-char
c-char:
any member of the source character set except
the single-quote ’, backslash \, or new-line character
escape-sequence
universal-character-name

A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by
the letter L, as in L’x’. A character literal that does not begin with L is an ordinary character literal, also
referred to as a narrow-character literal. An ordinary character literal that contains a single c-char has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set. An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.

Отже, послідовність символів у одинарних лапках у C якогось біса має тип int. Як не дивно, у лапках може бути і не один символ, тобто оголошення типу char b = 'abcd' є цілком допустимим. Якого значення при цьому набуде b обидва стандарти не визначають — залишено на розсуд розробників компілятора. Ну, а сама відмінність C++ полягає в тому, що чітко визначено, що коли в лапках один символ, то весь вираз має тип char і відповідне цьому символу значення.

Слід подякувати Uncle_Theodore за пост, з якого все почалося.

Категорії: C/C++ | Теґи:, ,

Залишити коментар