一些难堪的题目
第一道
#include<iostream>
using namespace std;
int main()
{
int a = 2147483647;
a = a + 1;
cout << "a=" << a << endl;
return 0;
}
输出:-2147483648
整型变量的边界,超过上界就回到下界。
如果是 2147483647+5 呢?
答案 -2147483644
第二道
#include<iostream>
using namespace std;
int main()
{
int b = 0, a = 100;
char ch = 'A';
b = a + ch;
cout << ch << " " << int(ch) << " " << b << endl;
return 0;
}
输出:A 65 165
字符的几个常见ACSII码值:
| 字符 | ASCII |
|---|---|
| A | 65 |
| a | 97 |
| 0 | 48 |
注意小写变大写就是 +32
第三道
#include<iostream>
using namespace std;
int main()
{
int a;
char b, ch;
a=50;
ch=’B’;
b = a + ch;
cout << ch << " " << int(ch) << " " << b << endl;
return 0;
}
输出:B 66 t
同第二道
强制类型转换:类型+()
第四道
#include<iostream>
using namespace std;
int main()
{
char x,y;
x = ‘ m ’ ;
y = ‘ n ’ ;
int n;
n = x < y;
cout << n << endl;
n = x == y - 1;
cout << n << endl;
n = ( ‘ y ’ != ‘ Y ’ ) + (5 > 3) + (y - x == 1);
cout << n << endl;
return 0;
}
输出:1
1
3
第一:n = x < y
因为 'm' < 'n',所以 x < y ,所以 n = 1.
第二:n = x == y - 1
因为 x == y - 1为真,所以 n = 1
第三:n = ('y' != 'Y') + (5 > 3) + (y - x == 1)
因为 'y' != 'Y' 且 (5 > 3) 且 (y - x == 1),所以 n = 1 + 1 + 1,所以 n = 3
第五道
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d;
a = 2; b = 3; c = 0;
d = (a + b || c);
cout << d << endl;
return 0;
}
输出:1
算术运算符 级别高于 逻辑运算符,故 a+b先算 5。
第六道
#include<iostream>
using namespace std;
int main(){
int a,b,c,d;
a = 2;
b = 3;
c = 0;
d = (a > b) && (c = 4);
cout << d << ” ” << c << endl;
return 0;
}
输出:0 0
涉及逻辑运算符的短路求值。
在 与运算&& 中表现为: 当前一个条件不成立时,其后的条件判断会中止(即短路)
当 d = (a < b) && (c = 4) 时,输出 1 4,起到对照,证明了短路求值的真实性。
第七道
#include<iostream>
using namespace std;
int main()
{
int x = 5,y = 10,z;
z = x > y ? x : y;
cout << z << endl;
z = x > 0 ? 1 : -1;
cout << z << endl;
cout << (x % 2 == 0 ? “ x is even ” : ” x is odd “ ) << endl;
return 0;
}
输出:10
1
x is odd
此题涉及三目运算符? :。
有a?x:y当a成立时,运算结果取x,反之取y。
另,题中x % 2 == 0 可简写为 x & 1(仅x>=0时)
第八道
#include<iostream>
using namespace std;
int a,b;
int main()
{
a = b = 5;
cout << a << ' ' << b << endl;
(a = b) = 10;
cout << a << ' ' << b << endl;
(a += b) = 20;
cout << a << ' ' << b << endl;
return 0;
}
输出:5 5
10 5
20 5
按照括号安排运算顺序,不再多说。
第九道
#include<iostream>
using namespace std;
int main()
{
int a,x, y;
a=10;
x=a++*5;
y=++a*5;
cout<<“x=“<<x<<“y=“<<y<<“a=“<<a<<endl;
return 0;
}
此题涉及自增自减运算。
以下给出几个例子:
假设有 a = 1, b = 2,按照以下语句依次执行运算。
a++
此时 a = 2, b = 2
++b
此时 a = 2, b = 3
int x = a--
此时 x = 2, a = 1, b = 3
int y = a+++b
此时 y = 4, a = 2, b = 3
以上总结出:
1、当自增减运算变量单独自增减(即不被赋值)的情况下,无论符号前后。
2、当自增减运算变量在自增减的同时,又被另一变量赋值时。则符号在前时,先改变此变量的值再参与运算;符号在后时,先参与运算后改变此变量的值。
第十道
#include<iostream>
using namespace std;
int main()
{
int a=0, b=3, c, d;
if(c=a<b)
{
d=1;
cout<<"d="<<d<<"\n";
}
return 0;
}
输出:d=1
关于此问题的讨论,参见 灌水区传送
当 if 语句中包含变量赋值时,不考虑是否赋值成功,而考虑所赋之值的非零性。
尾声
到此为止,题单还没结束。我将在明天继续更新!

浙公网安备 33010602011771号