C言語基礎考察

1675 ワード

次のプログラムの出力は何ですか?一目でわかるのではないでしょうか???
C言語の基本功を考察する.
1.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
	int a = 2, b = 7, c = 5;
	switch(a > 0)
	{
		case 1: switch(b < 0)
		{
			case 1 : printf("@"); break;
			case 2 : printf("!"); break;
		}
		case 0: switch(c == 5)
		{
			case 1: printf("*"); break;
			case 2: printf("#"); break;
			default: printf("#"); break;
		}
		default: printf("&");
	}
	printf("
"); return 0; }

答えは次のとおりです.
*&
a>0のためcase 1に入るとb<0がfalseであることが判明し、0に入るべきであるが、ない、このswitchを脱退するが、case 1はbreakがなく、case 0に入るしかなく、条件を満たした後に出力*、同様にbreakが脱退せず、defaultに入った後に出力&脱退する.
2.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;

int i = 0;

int fun1(int i)
{
	i = (i % i) * (i * i) / (2 * i) + 4;
	printf("i = %d
", i); return (i); } int fun2(int i) { i = i <= 2 ? 5 : 0; return (i); } int main() { int i = 5; fun2(i / 2); printf("i = %d
", i); fun2(i = i / 2); printf("i = %d
", i); fun2(i / 2); printf("i = %d
", i); fun1(i / 2); printf("i = %d
", i); return 0; }

答え:
5,2,2,4,2
解析:
知識点:1.関数はいずれも値伝達なので、外部iの値は変更されません.2.グローバル変数とローカル変数は近接の原則に合致する.
だから初めてi=5
そしてi=5/2=2
しかし、入ってから幾重にも演算した後、中のiは変化するが、戻るとiは解放され、元のiには影響しない.だからi=2
3回目i=2
4回目は、関数に入ると至近原則iによって局所変数に相当し、局所変数は4なので出力4ですが、printfになるとiはmainの中のiで、さっき関数にいたiとは関係ないので2