?
This document uses PHP Chinese website manual Release
不符合任何其他主要類(lèi)別的運(yùn)營(yíng)商的集合。
操作者 | 運(yùn)營(yíng)商名稱(chēng) | 例 | 描述 |
---|---|---|---|
(...) | 函數(shù)調(diào)用 | F(...) | 使用零個(gè)或多個(gè)參數(shù)調(diào)用函數(shù)f() |
, | 逗號(hào)運(yùn)算符 | a,b | 評(píng)估表達(dá)式a,忽視其返回值并完成任何副作用,然后評(píng)估表達(dá)式b,返回此評(píng)估的類(lèi)型和結(jié)果 |
(類(lèi)型) | 類(lèi)型轉(zhuǎn)換 | (類(lèi)型)的 | 將類(lèi)型轉(zhuǎn)換為類(lèi)型 |
? : | 條件運(yùn)算符 | 一個(gè) ?b:c | 如果a在邏輯上為真(不評(píng)估為零),則評(píng)估表達(dá)式b,否則評(píng)估表達(dá)式c |
的sizeof | 規(guī)模經(jīng)營(yíng)者 | sizeof a | 一個(gè)字節(jié)的大小 |
_Alignof(自C11以來(lái)) | _Alignof運(yùn)營(yíng)商 | _Alignof(類(lèi)型) | 類(lèi)型所需的對(duì)齊 |
函數(shù)調(diào)用表達(dá)式具有表單。
expression ( argument-list(optional) ) |
---|
其中
表達(dá) | - | 指針函數(shù)類(lèi)型的任何表達(dá)式(在左值轉(zhuǎn)換之后) |
---|---|---|
參數(shù)列表 | - | 任何完整對(duì)象類(lèi)型的逗號(hào)分隔的表達(dá)式列表(不能是逗號(hào)運(yùn)算符)。調(diào)用不帶參數(shù)的函數(shù)時(shí)可能會(huì)被省略。 |
函數(shù)調(diào)用表達(dá)式的行為取決于被調(diào)用函數(shù)的原型是否在調(diào)用點(diǎn)范圍內(nèi)。
1)參數(shù)的數(shù)量必須等于參數(shù)的數(shù)量(除非使用省略號(hào)參數(shù))。
2)每個(gè)參數(shù)的類(lèi)型都必須是一種類(lèi)型,以便隱式轉(zhuǎn)換,就像通過(guò)賦值存在將相應(yīng)參數(shù)的非限定類(lèi)型轉(zhuǎn)換為參數(shù)類(lèi)型一樣。
此外,對(duì)于在and之間使用關(guān)鍵字static的數(shù)組類(lèi)型的每個(gè)參數(shù),參數(shù)表達(dá)式都必須指定一個(gè)指向數(shù)組元素的指針,該數(shù)組元素至少具有參數(shù)大小表達(dá)式中指定的許多元素。 | (自C99以來(lái)) |
---|
3)參數(shù)以未指定的順序進(jìn)行評(píng)估,無(wú)需排序。
4)賦值(直到C11)執(zhí)行初始化(從C11開(kāi)始),將每個(gè)參數(shù)的值復(fù)制到相應(yīng)的函數(shù)參數(shù)(注意;該函數(shù)可以修改其參數(shù),并且這些更改不會(huì)影響參數(shù); C函數(shù)調(diào)用只是調(diào)用 - 值)。
如果存在尾部省略號(hào)參數(shù),則對(duì)剩余參數(shù)執(zhí)行默認(rèn)參數(shù)提升,這些參數(shù)可用va_list
。
5)函數(shù)被執(zhí)行,并且它返回的值成為函數(shù)調(diào)用表達(dá)式的值(如果函數(shù)返回void,則函數(shù)調(diào)用表達(dá)式是一個(gè)void表達(dá)式)
void f(char* p, int x) {}int main(void){ f("abc", 3.14); // array to pointer and float to int conversions}
1)參數(shù)以未指定的順序進(jìn)行評(píng)估并且沒(méi)有排序。
2)在每個(gè)參數(shù)表達(dá)式上執(zhí)行默認(rèn)參數(shù)促銷(xiāo)。
3)賦值(直到C11)執(zhí)行初始化(從C11開(kāi)始),將每個(gè)自變量的值復(fù)制到相應(yīng)的函數(shù)參數(shù)中。
4)函數(shù)被執(zhí)行,并且它返回的值成為函數(shù)調(diào)用表達(dá)式的值(如果函數(shù)返回void,則函數(shù)調(diào)用表達(dá)式是一個(gè)void表達(dá)式)
void f(); // no prototypeint main(void){ f(1, 1.0f); // UB unless f is defined to take an int and a double}void f(int a, double c) {}
沒(méi)有原型的函數(shù)調(diào)用函數(shù)的行為是未定義的。
參數(shù)的數(shù)量與參數(shù)的數(shù)量不匹配。
提升的參數(shù)類(lèi)型與除了那些參數(shù)的提升類(lèi)型不兼容
如果參數(shù)的值可由兩種類(lèi)型表示,則認(rèn)為兼容的相同整數(shù)類(lèi)型的有符號(hào)和無(wú)符號(hào)版本是兼容的。
指向void的指針和指向(可能是cvr限定的)字符類(lèi)型的指針被認(rèn)為是兼容的
指定要調(diào)用的函數(shù)的表達(dá)式的評(píng)估和所有參數(shù)相對(duì)于彼此是不相關(guān)的(但是在函數(shù)的主體開(kāi)始執(zhí)行之前有一個(gè)序列點(diǎn))。
(*pf[f1()]) (f2(), f3() + f4()); // f1, f2, f3, f4 may be called in any order
盡管函數(shù)調(diào)用只是為指向函數(shù)的指針定義的,但由于函數(shù)到指針的隱式轉(zhuǎn)換,它可以與函數(shù)指示符一起工作。
int f(void) { return 1; }int (*pf)(void) = f;int main(void){ f(); // convert f to pointer, then call (&f)(); // create a pointer to function, then call pf(); // call the function (*pf)(); // obtain the function designator, convert to pointer, then calls (****f)(); // convert to pointer, obtain the function, repeat 4x, then call (****pf)(); // also OK}
忽略未使用參數(shù)的函數(shù)(如printf
,)必須在范圍內(nèi)使用原型調(diào)用(此類(lèi)函數(shù)的原型必須使用尾部省略號(hào)參數(shù))以避免調(diào)用未定義的行為。
C11之后的缺陷報(bào)告DR 427在調(diào)用具有原型的函數(shù)時(shí),為了允許const限定類(lèi)型的參數(shù)(事實(shí)上允許),從賦值到初始化相應(yīng)的參數(shù),改變了準(zhǔn)備函數(shù)參數(shù)的語(yǔ)義。允許的隱式轉(zhuǎn)換保留隱式轉(zhuǎn)換,就像通過(guò)賦值一樣,因?yàn)檫@是初始化也使用的。
一個(gè)函數(shù)調(diào)用表達(dá)式,其中表達(dá)式完全由一個(gè)標(biāo)識(shí)符組成,并且該標(biāo)識(shí)符未聲明,就像標(biāo)識(shí)符被聲明為一樣。extern int identifier(); //返回int并且沒(méi)有原型所以下面的完整程序是有效的C89:main(){int n = atoi(“123”); //隱式聲明atoi為int atoi()} | (直到C99) |
---|
逗號(hào)運(yùn)算符表達(dá)式具有表單。
lhs , rhs |
---|
其中
LHS | - | 任何表達(dá) |
---|---|---|
RHS | - | 除另一個(gè)逗號(hào)運(yùn)算符以外的任何表達(dá)式(換句話說(shuō),逗號(hào)運(yùn)算符的結(jié)合性是從左到右的) |
首先,評(píng)估左操作數(shù)lhs,并丟棄其結(jié)果值。
然后,發(fā)生一個(gè)序列點(diǎn),以使lhs的所有副作用都完成。
然后,評(píng)估右操作數(shù)rhs,并將其結(jié)果作為非左值由逗號(hào)運(yùn)算符返回。
lhs的類(lèi)型可能是void
(也就是說(shuō),它可能是對(duì)返回的函數(shù)的調(diào)用void
,或者它可能是一個(gè)表達(dá)式void
)。
逗號(hào)運(yùn)算符可能是C ++中的左值,但從不C中。
逗號(hào)運(yùn)算符可以返回一個(gè)結(jié)構(gòu)(唯一的其他返回結(jié)構(gòu)的表達(dá)式是復(fù)合文字,函數(shù)調(diào)用,賦值和條件運(yùn)算符)。
在以下上下文中,逗號(hào)運(yùn)算符不能出現(xiàn)在表達(dá)式的頂級(jí),因?yàn)槎禾?hào)具有不同的含義:
函數(shù)調(diào)用中的參數(shù)列表
初始化器表達(dá)式或初始化器列表
通用選擇
如果逗號(hào)運(yùn)算符必須在這種情況下使用,則必須加上括號(hào):
// int n = 2,3; // error, comma assumed to begin the next declarator// int a[2] = {1,2,3}; // error: more declarators than elementsint n = (2,3), a[2] = {(1,2),3}; // OK f(a, (t=3, t+2), c); // OK, first, stores 3 in t, then calls f with three arguments
頂級(jí)逗號(hào)運(yùn)算符也被禁止在數(shù)組邊界內(nèi)。
// int a[2,3]; // errorint a[(2,3)]; // OK, VLA array of size 3 (VLA because (2,3) is not a constant expression)
逗號(hào)運(yùn)算符不允許在常量表達(dá)式中使用,無(wú)論它是否在頂層。
// static int n = (1,2); // Error: constant expression cannot call the comma operator
請(qǐng)參閱 cast 操作。
條件運(yùn)算符表達(dá)式具有該形式。
condition ? expression-true : expression-false |
---|
其中
condition | - | an expression of scalar type |
---|---|---|
expression-true | - | the expression that will be evaluated if condition compares unequal to zero |
expression-false | - | the expression that will be evaluated if condition compares equal to zero |
只有以下表達(dá)式被允許為expression-true和expression-false。
任何算術(shù)類(lèi)型的兩個(gè)表達(dá)式
相同結(jié)構(gòu)或聯(lián)合類(lèi)型的兩個(gè)表達(dá)式
void類(lèi)型的兩個(gè)表達(dá)式
指針類(lèi)型的兩個(gè)表達(dá)式,指向兼容的類(lèi)型,忽略cvr限定符
一個(gè)表達(dá)式是一個(gè)指針,另一個(gè)是空指針常量(如NULL
)
一個(gè)表達(dá)式是一個(gè)指向?qū)ο蟮闹羔?,另一個(gè)是指向void的指針(可能是合格的)
1)首先,評(píng)估狀況。評(píng)估后有一個(gè)順序點(diǎn)。
2)如果條件的結(jié)果不等于零,則執(zhí)行表達(dá)式真,否則執(zhí)行異常錯(cuò)誤
3)執(zhí)行從評(píng)估結(jié)果到通用類(lèi)型的轉(zhuǎn)換,定義如下:
1)如果表達(dá)式具有算術(shù)類(lèi)型,則通用類(lèi)型是常規(guī)算術(shù)轉(zhuǎn)換后的類(lèi)型
2)如果表達(dá)式具有struct / union類(lèi)型,則通用類(lèi)型是該結(jié)構(gòu)/聯(lián)合類(lèi)型
3)如果表達(dá)式都是無(wú)效的,整個(gè)條件運(yùn)算符表達(dá)式就是一個(gè)void表達(dá)式
4)如果一個(gè)是指針而另一個(gè)是空指針常量,則該類(lèi)型是該指針的類(lèi)型
5)如果兩者都是指針,則結(jié)果是指向組合指向類(lèi)型的cvr限定符的類(lèi)型的指針(即,如果一個(gè)是const int*
另一個(gè)volatile int*
,則結(jié)果是const volatile int*
),并且如果類(lèi)型不同,指向類(lèi)型是復(fù)合類(lèi)型。
6)如果一個(gè)指向void的指針,則結(jié)果是一個(gè)指向無(wú)效且具有組合的cvr限定符的指針
條件運(yùn)算符永遠(yuǎn)不是左值表達(dá)式,盡管它可能會(huì)返回struct / union類(lèi)型的對(duì)象。唯一可能返回stucts的其他表達(dá)式是賦值,逗號(hào),函數(shù)調(diào)用和復(fù)合文字。
請(qǐng)注意,在C ++中,它可能是一個(gè)左值表達(dá)式。
有關(guān)此運(yùn)算符和賦值的相對(duì)優(yōu)先級(jí)的詳細(xì)信息,請(qǐng)參閱運(yùn)算符優(yōu)先級(jí)。
條件運(yùn)算符具有從右到左的關(guān)聯(lián)性,這允許鏈接。
struct vehicle v = arg == 'B' ? bus : arg == 'A' ? airplane : arg == 'T' ? train : arg == 'C' ? car : arg == 'H' ? horse : feet;
請(qǐng)參閱sizeof運(yùn)算符。
參見(jiàn)對(duì)齊操作符。