乙個關於C 運算子的小問題

2021-05-23 14:05:05 字數 4250 閱讀 4332

最近碰見一道

c++面試題,具體記不太清了,大概是問:

(x, x+20), x+29

這個表示式的值,顯然多數人會回答是

x+29

,不過面試官給的答案是

x+20。

呵呵,他給出了驗證**

int main()

列印出的結果是

21,的確是

x+20

的取值。

驗證的結果的確是我們錯了,可是大家是不是覺得有些問題。

給大家看個東西,也許問題就有答案了。

precedence

operator

description

example

associativity

1 ()

->.::

++--

grouping operator

array access

member access from a pointer

member access from an object

scoping operator

post-increment

post-decrement

(a + b) / 4;

array[4] = 2;

ptr->age = 34;

obj.age = 34;

class::age = 2;

for( i = 0; i < 10; i++ ) ...

for( i = 10; i > 0; i-- ) ...

left to right

2 !

~++---

+*&(type)

sizeof

logical negation

bitwise complement

pre-increment

pre-decrement

unary minus

unary plus

dereference

address of

cast to a given type

return size in bytes

if( !done ) ...

flags = ~flags;

for( i = 0; i < 10; ++i ) ...

for( i = 10; i > 0; --i ) ...

int i = -1;

int i = +1;

data = *ptr;

address = &obj;

int i = (int) floatnum;

int size = sizeof(floatnum);

right to left

3 ->*.*

member pointer selector

member pointer selector

ptr->*var = 24;

obj.*var = 24;

left to right

4 *

/%

multiplication

division

modulus

int i = 2 * 4;

float f = 10 / 3;

int rem = 4 % 3;

left to right

5 +

- addition

subtraction

int i = 2 + 3;

int i = 5 - 1;

left to right

6 <<

>>

bitwise shift left

bitwise shift right

int flags = 33 << 1;

int flags = 33 >> 1;

left to right

7 <

<=

>

>=

comparison less-than

comparison less-than-or-equal-to

comparison greater-than

comparison geater-than-or-equal-to

if( i < 42 ) ...

if( i <= 42 ) ...

if( i > 42 ) ...

if( i >= 42 ) ...

left to right

8 ==

!= comparison equal-to

comparison not-equal-to

if( i == 42 ) ...

if( i != 42 ) ...

left to right

9 &

bitwise and

flags = flags & 42;

left to right

10 ^

bitwise exclusive or

flags = flags ^ 42;

left to right

11 |

bitwise inclusive (normal) or

flags = flags | 42;

left to right

12 &&

logical and

if( conditiona && conditionb ) ...

left to right

13 ||

logical or

if( conditiona || conditionb ) ...

left to right

14 ? :

ternary conditional (if-then-else)

int i = (a > b) ? a : b;

right to left

15 =

+=-=

*=/=

%=&=

^=|=

<<=

>>=

assignment operator

increment and assign

decrement and assign

multiply and assign

divide and assign

modulo and assign

bitwise and and assign

bitwise exclusive or and assign

bitwise inclusive (normal) or and assign

bitwise shift left and assign

bitwise shift right and assign

int a = b;

a += 3;

b -= 4;

a *= 5;

a /= 2;

a %= 3;

flags &= new_flags;

flags ^= new_flags;

flags |= new_flags;

flags <<= 2;

flags >>= 2;

right to left

16 ,

sequential evaluation operator

for( i = 0, j = 0; i < 10; i++, j++ ) ...

left to right

呵呵,「

=」「,」都是運算子,而且其優先順序都很低,但是「

=」還是比「,」高了一點點,那麼上面的問題就好解決了。

y = (x, x+20), x+29;

上面這一行其實相當於

(y = (x, x+20)), x+29;

y表示的只能是

x, x+20

這個表示式的值,考官的驗證方法不對,應該寫成

y =( (x, x+20), x+29);

再試一下,果然結果是

30,是

x+29

的值了。

其實大家在這個問題上的觀點是對的,把問題做對了就完了嗎,碰見新的問題還是要思考一下的。

關於Jsoup的乙個小問題

利用jsoup可以實現對網頁資訊進行有效解析和提取,例如有網頁內容如下 hello,jsoup jsoup的官方 利用jsoup提取標籤的內容,如下 document doc null trycatch ioexception ioe 提取標籤的內容 string strtitle doc.sele...

乙個關於選擇的小問題

以前看過這樣乙個問題 乙個人參加有獎答題,主持人給出了a b c三個選項。這個不知道問題的答案,就隨便選了乙個選項。然後主持人排除了剩下兩個答案中的乙個,告訴這個人有一次改變自己選項的機會。請問 這時候這個人該不該改變自己的選項?剛看到這個問題,我的第一反映是完全沒必要,因為既然排除了乙個錯誤選項,...

關於指標的乙個小問題

任務 c primer 4th 習題5.18 編寫程式定義乙個vector物件,其每個元素都是指向string型別的指標,讀取該vector物件,輸出每個string的內容及其相應的長度。自己的方法 string s string sarr 10 vector內的每個元素都是指向string型別的指...