《C++编程思想》(第二版)第3章 C++中的C(笔记、习题及答案)(二)

<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <string>
using namespace std;

void stringRef(string& s) 
{
    s += " come blow";
}

void stringPtr(string* p) 
{
    p->append(" your horn");
}

int main() 
{
    string s = "Little Boy Blue";
    stringRef(s);
    stringPtr(&s);
    cout << s << endl;
}</span></span>


<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
using namespace std;

int main(int argc, char* argv[]) 
{
    unsigned int n;
    if (argc != 2 || (n = atoi(argv[1])) <= 0)
	{
        return 1;
	}
    cout << ~(n ^ 0xf0f0) << '
';
    return 0;
}</span></span>

<span style="font-size:18px;">#include <iostream>
using namespace std;

void func()
{
	int i = 0;
	cout<<"i = "<<++i<<endl;
}

int main()
{
	for(int x = 0;x < 10;x++)
	{
		func();
	}

	return 0;
}</span>

此时输出皆为1,由于函数中定义的局部变量在函数作用域结束时消失。当再次调用这个函数时。会又一次创建该变量的存储空间,其值会被又一次初始化。

所以去掉static会使得其变为局部变量,每次调用都又一次初始化。输出都为1。

虽然在FileStatic.cpp中fs声明为extern,可是连接器不会找到它,由于在FileStatic.cpp中它被声明为static。


<span style="font-size:18px;">#include <iostream>
using namespace std;

int main()
{
	double i,j;
	const double EPSILON = 1e-6;
	cout<<"Enter an integer:";
	cin>>i;
	cout<<"Enter another integer:";
	cin>>j;
	cout<<"i<j is"<<" "<<(i-j<EPSILON)<<endl;
	cout<<"i>=j is"<<" "<<(i-j>=EPSILON)<<endl;
	cout<<"i<=j is"<<" "<<(i-j<=EPSILON)<<endl;
	cout<<"i==j is"<<" "<<(i==j)<<endl;
	cout<<"i!=j is"<<" "<<(i!=j)<<endl;
	cout<<"i&&j is"<<" "<<(i&&j)<<endl;
	cout<<"i||j is"<<" "<<(i||j)<<endl;
	cout<<"(i<10)&&(j<10) is"<<" "<<((i-10<EPSILON)&&(j-10<EPSILON))<<endl;

	return 0;
}</span>



因为编译器不兼容,将显示运算符列举例如以下:

keyword 含义
and &&(逻辑与)
or ||(逻辑或)
not !(逻辑非)
not_eq !=(逻辑不等)
bitand &(位与)
and_eq &=(位与-赋值)
bitor |(位或)
or_eq |=(位或-赋值)
xor ^(位异或)
xor_eq ^=(位异或-赋值)
compl ~(补)



<span style="font-size:18px;">#include <iostream>
using namespace std;

void printBinary(const unsigned char val);
unsigned char rol(unsigned char val);
unsigned char ror(unsigned char val);

#define PL(STR,EXPR) 
	cout<<STR; printBinary(EXPR);rol(EXPR); cout<<endl;
#define PR(STR,EXPR) 
	cout<<STR; printBinary(EXPR);ror(EXPR); cout<<endl;

int main()
{
	unsigned int getval;
	unsigned char a,b;
	cout<<"Enter a number :"<<endl;
	cin>>getval;
	a = getval;
	PL("a in binary:",a);
	cout<<"Enter a number :"<<endl;
	cin>>getval;
	b = getval;
	PR("b in binary:",b);
	PR("a | b = ",a|b);
	PR("a & b = ",a&b);
	PR("a ^ b = ",a^b);
	PR("~a = ",~a);
	PR("~b = ",~b);
	unsigned char c = 0x5A;
	PR("c in binary: ",c);
	a |= c;
	PR("a |= c ;a =  ",a);
	b &= c;
	PR("b &= c ;b =  ",b);
	b ^= a;
	PR("b ^= a ;b =  ",b);

	return 0;
}

void printBinary(const unsigned char val)
{
	for(int i = 7;i >= 0;--i)
	{
		if(val & (1<<i))
		{
			cout<<"1";
		}
		else
		{
			cout<<"0";
		}
	}
}
unsigned char rol(unsigned char val)
{
	int highbit;
	if(val & 0x80)
	{
		highbit = 1;
	}
	else
	{
		highbit = 0;
	}
	val<<=1;
	val |= highbit;

	return val;
}


unsigned char ror(unsigned char val)
{
	int lowbit;
	if(val & 1)
	{
		lowbit = 1;
	}
	else
	{
		lowbit = 0;
	}
	val>>=1;
	val |= (lowbit<<7);

	return val;
}</span>


<span style="font-size:18px;">#include <iostream>
using namespace std;

int main()
{
	int i;
	cout<<"type a number and 'Enter'"<<endl;
	cin>>i;
	cout<<((i>5)?"It's greater than 5":((i<5)?"It's less than 5"
		:"It's equal to 5"))<<endl;;
	cout<<"type a number and 'Enter'"<<endl;
	cin>>i;
	cout<<((i<10)?((i>5)?"5<i<10":"i<=5"):"i>=10")<<endl;;

	return 0;
}</span>



<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <string>
using namespace std;

typedef struct 
{
    string last;
    string first;
    int age;
} Person;

int main() 
{
    using namespace std;
    Person p;
    p.last = "Einstein";
    p.first = "Albert";
    p.age = 122;
    cout << p.last << ',' << p.first << ',' << p.age << endl;
    
    Person* pptr = &p;
    pptr->last = "Alger";
    pptr->first = "Horatio";
    pptr->age = 167;
    cout << pptr->last << ',' << pptr->first << ',' << pptr->age
         << endl;
}</span></span>


<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
using namespace std;

enum color 
{
    BLACK,
    RED,
    GREEN,
    BLUE,
    WHITE
};

int main() 
{
    for (int hue = BLACK; hue <= WHITE; ++hue)
	{
        cout << hue << ' ';
	}
	cout<<endl;

	return 0;
}</span></span>


<span style="font-size:18px;">#include <iostream>
using namespace std;

union Packed
{
	char i;
	short j;
	int k;
	long l;
	float f;
	double d;
};

int main()
{
	cout<<"sizeof(Packed) = "
		<<sizeof(Packed)<<endl;
	Packed x;
	x.i = 'c';
	cout<<x.i<<endl;
	x.d = 3.14159;
	cout<<x.d<<endl;
	cout<<x.i<<endl;

	return 0;
}</span>

输出结果:

将double d删除后输出结果:

从中可得到union开辟空间大小取决于元素最大值,对其一个元素赋值。其余值会输出没用的信息。

<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
using namespace std;

void print(char* name, int* array, int size) 
{
	for(int i = 0; i < size; i++)
		cout << name << "[" << i << "] (" 
		<< (long)(&array[i]) << ") = " 
		<< array[i] << endl;
}

// A preprocessor macro to simplify the printing
// of all the data in main():
#define PRT(A, B, C, D) 
	print(#A, A, sizeof A / sizeof *A); 
	print(#B, B, sizeof B / sizeof *B); 
	cout << #C " (" << (long)(&C) << ") = " 
	<< C << endl; 
print(#D, D, sizeof D / sizeof *D);

int main() 
{
	int a[] = { 1, 2, 3 };
	int b[] = { 4, 5, 6 };
	char c = 'x';
	int d[] = { 7, 8, 9 };
	PRT(a, b, c, d);
	cout << "Index off the end of a:
";
	a[3] = 47;
	PRT(a, b, c, d);
	cout << "Index off the end of b:
";
	b[3] = 27;
	PRT(a, b, c, d);
	cout << "Abuse c with pointers and casts:
";
	*((double*)&c) = 99.99;
	PRT(a, b, c, d);

	return 0;
}</span></span>


<span style="font-size:18px;">#include <iostream>
using namespace std;

int main()
{
	int a[10];
	cout<<"sizeof(int) = "<<sizeof(int)<<endl;
	for(int i = 0;i < 10;i++)
	{
		cout<<"&a["<<i<<"]="<<(long)&a[i]<<endl;
	}
	char b[10];
	cout<<"sizeof(char) = "<<sizeof(char)<<endl;
	for(i = 0;i < 10;i++)
	{
		cout<<"&b["<<i<<"]="<<(long)&b[i]<<endl;
	}
	float c[10];
	cout<<"sizeof(float) = "<<sizeof(float)<<endl;
	for(i = 0;i < 10;i++)
	{
		cout<<"&c["<<i<<"]="<<(long)&c[i]<<endl;
	}
	double d[10];
	cout<<"sizeof(double) = "<<sizeof(double)<<endl;
	for(i = 0;i < 10;i++)
	{
		cout<<"&d["<<i<<"]="<<(long)&d[i]<<endl;
	}

	return 0;
}</span>

也能够使用模板。

<span style="font-size:18px;">#include <iostream>
using namespace std;

typedef struct
{
	int i,j,k;
}ThreeDpoint;

int main()
{
	ThreeDpoint p[10];
	cout<<"sizeof(ThreeDpoint) = "<<sizeof(ThreeDpoint)<<endl;
	for(int i = 0;i < 10;i++)
	{
		cout<<"&p["<<i<<"]="<<(long)&p[i]<<endl;
	}

	return 0;
}</span>


<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string stringArray[] = {"one", "small", "step",
                            "for", "man"};
    const int nStrings = sizeof(stringArray)/sizeof(stringArray[0]);
    for (int i = 0; i < nStrings; ++i)
	{
        cout << stringArray[i] << endl;
	}

	return 0;
}</span></span>



<span style="font-size:18px;">#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
	for(int  i = 1;i < argc;i++)
	{
		cout<<atol(argv[i])<<endl;
	}

	return 0;
}</span>

<span style="font-size:18px;">#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
	for(int  i = 1;i < argc;i++)
	{
		cout<<atof(argv[i])<<endl;
	}

	return 0;
}</span>


<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
using namespace std;

typedef union 
{
	char c;
	short s;
	int i;
	long l;
	float f;
	double d;
	long double ld;
} Primitives;

int main() 
{
	Primitives p[10];
	Primitives* pp = p;
	cout << "sizeof(Primitives) = " 
		<< sizeof(Primitives) << endl;
	cout << "pp = " << (long)pp << endl;
	pp++;
	cout << "pp = " << (long)pp << endl;
	cout << "sizeof long double = " << sizeof(long double) << endl;
} </span></span>


long:

<span style="font-size:18px;">#include <iostream>
using namespace std;

#define P(EX) cout<<#EX<<":"<<EX<<endl;

int main()
{
	long a[10];
	for(int i = 0;i < 10;i++)
	{
		a[i] = i;
	}
	long* ip = a;
	P(*ip);
	P(*++ip);
	P(*(ip+5));
	long* ip2 = ip+5;
	P(*ip2);
	P(*(ip2-4));
	P(*--ip2);
	P(ip2-ip);

	return 0;
}</span>

执行结果例如以下:

long double:

#include <iostream>
using namespace std;

#define P(EX) cout<<#EX<<":"<<EX<<endl;

int main()
{
	long double a[10];
	for(int i = 0;i < 10;i++)
	{
		a[i] = i;
	}
	long double* ip = a;
	P(*ip);
	P(*++ip);
	P(*(ip+5));
	long double* ip2 = ip+5;
	P(*ip2);
	P(*(ip2-4));
	P(*--ip2);
	P(ip2-ip);

	return 0;
}

执行结果例如以下:

发现结果同样。


方法一:

<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
using namespace std;

void printBinary(unsigned char);

int main() 
{
    float x = 128.0;
    unsigned char* p = reinterpret_cast<unsigned char*>(&x);
    for (int i = 0; i < sizeof(float); ++i)
	{
        printBinary(p[i]);
	}
    cout << endl;

	return 0;
}</span></span>


方法二:

<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <cstddef> // For size_t
using namespace std;

void printBinary(unsigned char);

void printBytes(const void *p, size_t n) 
{
    const unsigned char* pByte =
        reinterpret_cast<const unsigned char*>(p);
    for (size_t i = 0; i < n; ++i)
	{
        printBinary(pByte[i]);
	}
    cout << endl;
}

int main() 
{
    float x = 128.0;
    printBytes(&x, sizeof x);

	return 0;
}</span></span>


此处有问题,仅供參考

<span style="font-size:18px;">#include <iostream>
using namespace std;

void func(void* p, int number, int val)
{
	int* s = (int *)p;
	static int i = 0;
	if(i<number)
	{
		s[i] = val;
	}
}
int main()
{
	int a[10];
	int i;
	i = static_cast<int>(a[0]);
	void *ip = &i;
	for(int j = 0;j < sizeof(a)/sizeof(a[0]);++j)
	{
		func(ip,sizeof(a)/sizeof(a[0]),a[i]);
	}

	return 0;
}</span>



仅供參考

<span style="font-size:18px;">#include <iostream>
using namespace std;

int main()
{
	const double i[10] = {1,2,3,4,5,6,7,8,9,0};
	double* j[10] = {0};
	for(int m = 0;m < 10;++m)
	{
		j[m] = const_cast<double*>(&i[m]);
	}
	volatile double k[10] = {0,1,2,3,4,5,6,7,8,9};
	double* u[10] = {0};
	for(m = 0;m < 10;++m)
	{
		u[m] = const_cast<double*>(&k[m]);
	}

	return 0;
}</span>



仅供參考

<span style="font-size:18px;">#include <iostream>
using namespace std;

void fun(double *s, int size)
{
	for(int i = 0;i < size;++i)
	{
		cout<<s[i]<<" ";
	}
	cout<<endl;
}


int main()
{
	double d[10] = {0};
	fun(d,sizeof(d)/sizeof(d[0]));
	unsigned char* df = reinterpret_cast<unsigned char*>(&d[0]);
	for(int i = 0;i < sizeof(d)/sizeof(d[0]);++i)
	{
		df[i] = 1;
	}
	fun((double*)df,sizeof(df)/sizeof(df[0]));
	return 0;
}</span>



<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <climits>
using namespace std;

void ieeePrint(float x) 
{
    unsigned char* p = reinterpret_cast<unsigned char*>(&x);
    int bitno = 0;
        
    for (int i = sizeof(float)-1; i >= 0; --i) 
	{
        for (int j = CHAR_BIT-1; j >= 0; --j, ++bitno) 
		{
            cout << !!(p[i] & (1 << j));
            if (bitno == 0 || bitno == 8)  // IEEE boundaries
			{
                cout << ' ';
			}
        }
    }
    cout << endl;
}

int main() 
{
    ieeePrint(2.0);
    ieeePrint(6.5);
    ieeePrint(-6.5);

	return 0;
}</span></span>


仅供參考

CPP = mycompiler

.SUFFIXES: .exe .cpp

.cpp .exe:

               $(CPP) $<

YourPets1.exe:

YourPets2.exe:


仅供參考

<span style="font-size:18px;">#include <iostream>
using namespace std;

#define P(A) cout<< #A <<": "<< (A) <<endl;

#ifdef P(A)

int main()
{
	int a = 1,b = 2,c = 3;
	P(a);P(b);P(c);
	P(a+b);
	P((c-a)/b);

	return 0;
}
#endif</span>



<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>

int round(double x) 
{
    // round to nearest int:
    return static_cast<int>(x + 0.5);
}

int main() 
{
    using namespace std;
    int (*fp)(double) = round;
    cout << fp(2.5) << endl;   // 3

	return 0;
}</span></span>



             float (*(*fp1)(int))(char);

FunctionTable.cpp源程序

<span style="font-size:18px;">#include <iostream>
using namespace std;

#define DF(N) void N(){
cout<<"function" #N "called..."<<endl;}

DF(a);DF(b);DF(c);DF(d);DF(e);DF(f);DF(g);

void (*func_table[])() = {a,b,c,d,e,f,g};

int main()
{
	while(1)
	{
		cout<<"press a key from 'a' to 'g'"
			"or q to quit"<<endl;
		char c,cr;
		cin.get(c);
		cin.get(cr);
		if(c == 'q')
		{
			break;
		}
		if(c < 'a' || c > 'g')
		{
			continue;
		}
		(*func_table[c - 'a'])();
	}

	return 0;
}</span>

此处有问题,希望大家解答。


<span style="font-size:18px;"><span style="font-size:18px;">#include<iostream>
using namespace std;

int main() 
{
  int num1, num2, product, startDigit[4], 
    productDigit[4], count = 0, vampCount = 0, 
    x, y;
  for(num1 = 10; num1 <= 99; num1++) 
  {
    for(num2 = 10; num2 <= 99; num2++) 
	{
      product = num1 * num2;
      startDigit[0] = num1 / 10;
      startDigit[1] = num1 % 10;
      startDigit[2] = num2 / 10;
      startDigit[3] = num2 % 10;
      productDigit[0] = product / 1000;
      productDigit[1] = (product % 1000) / 100;
      productDigit[2] = product % 1000 % 100/10;
      productDigit[3] = product % 1000 % 100%10;
      count = 0;
      for(x = 0; x < 4; x++) 
	  {
        for(y = 0; y < 4; y++) 
		{
          if (productDigit[x] == startDigit[y]) 
		  {
            count++;
            productDigit[x] = -1;
            startDigit[y] = -2;
            if (count == 4) 
			{
              vampCount++;
              if (vampCount < 10)
			  {
                cout << "Vampire number  " 
                  << vampCount << " is " 
                  << product << "  " << num1 
                  << num2 << endl;
			  }
              else
			  {
                cout << "Vampire number " 
                  << vampCount << " is " 
                  << product << "  " << num1 
                  << num2 << endl;
			  }
            }
          }
        }
      }
    }
  }
  return 0;
}</span></span>


原文地址:https://www.cnblogs.com/yutingliuyl/p/7300264.html