下午上了VC++课,老师念完PPT,由于C++是在C上++的,我不屑于听他讲课,刷着最右,他出了几道很简单但很基础的代码题,我抬头看了看,很基础的题,真的很基础。但是我没算出正确答案。
int a(3),b(4),c;
c=a>b?++a:++b;
cout<<c<<endl;
cout<<a<<b<<endl;
c=a-b?a+b:a-3?b:a;
cout<<c<<endl;
c=a-b?a+b:(a-3?b:a);
看下这段代码
考得很基础。
首先,看第一个C=………………
c=a>b?++a:++b;
a为3,b为4,当然?前面是false,所以执行++b。
此时a为3,b为5.
看第二个C=………………
c=a-b?a+b:a-3?b:a;
其实吧,第二个C……和第三个C……是一样的,因为结合性是从右向左结合的。
c=a-b?a+b:(a-3?b:a);
a-3为0,逻辑假,选择冒号后面的a,括号里面是a的值3;
然后,再算a-b为-2,为真,选择冒号前面的a+b
所以c=a+b=3+5=8
很基础,但我但是就是算不出来,想想还是自己心浮气躁
沉不下来,太浮躁了,什么事也做不成。
再看几个例子
1.
int i=3,j=0,a;
a=(i+j)&&i++;
cout<<a<<" "<<i<<endl;
这个比较简单,&&左边为3,右边为3
同时为真,a也为真,即1.
a为1
i为4
2.
int i=3,j=0,a;
a=(i+j)||i++;
cout<<a<<" "<<i<<endl;
这个,大多数人会认为,输出a为1,i为4,其实不然
||这个运算符:只要他左边或右边只要有一个为真,a就为真,当i+j为三时,这时,他左边已经为1了,无需判断他右边是否为1,
所以,没有执行i++。所以i为3.
3.
int i=3,j=0,a;
a=(i++)+(i++);
cout<<a<<" "<<i<<endl;
这个在Dev上输出是7,5,在vc上是6,5
i是后增量,执行后,加两次。
4.
int i=3,j=0,a;
a=(++i)+(++i);
cout<<a<<" "<<i<<endl;
这个是在执行a……这一行之前把i++了两次。i=5,再执行a=……这一行
10,5
5.
int i=3,j=0,a;
a=(i++)+(++i);
cout<<a<<" "<<i<<endl;
执行之前,由于有++i,i=4,a=两个i相加,执行之后,i又加了一次。8,5
还是小学那句话,虚心使人进步,董明珠说过:战战兢兢,如履薄冰,才能做好每一件事。
沉下来,在大学里,拼命地吸收知识的养分。