C言語で&はどう利用するの?
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
&a,*b:アドレス演算子(&)と間接演算子(*)
あなたがscanf関数を利用する時,変数の前に&をつけましたよね.
この&はアドレス演算子を呼び,その変数のアドレスを指します.
また,変数の前につける*は間接演算子と呼び,そのアドレスの値を指します.
アドレス演算子と間接演算子を利用するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { int a; int *b = &a; printf("Please input an integer: "); scanf("%d", &a); printf("&a = %p, a = %d\n", &a, a); printf("b = %p, *b = %d\n", b, *b); return 0; } |
実行結果は以下になります.
アドレスの値は実行毎に変わります.
3行目の行末のscanf関数による変数aの読み込みで「3」と入力したら,aに3が格納されました.
また,int型のポインタ変数bはaのアドレス&aを指しています(address_operator.cの10行目).
なので,bのアドレスと*bが,それぞれ&aとaと同じになります.
1 2 3 4 5 |
$ gcc address_operator.c $ a.out Please input an integer: 3 &a = 0x7fffae726b4c, a = 3 b = 0x7fffae726b4c, *b = 3 |
アドレス演算子(&)と間接演算子(*)は,ポインタ演算子です.
ポインタ演算子の詳細を知りたいあなたは,ポインタとはを読みましょう.
a && b:論理積演算子(&&)
論理積演算子(&&)は,aとbの両方とも真の時に真,そうでなければ偽になります.
論理積演算子を利用するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { int a, b; printf("Please input two integers: "); scanf("%d%d", &a, &b); if (a > 0 && b > 0) { printf("%d and %d are both positive.\n", a, b); } else { printf("%d and %d are not both positive.\n", a, b); } return 0; } |
実行結果は以下になります.
3と4を入力した場合は「3 and 4 are both positive.」,3と0を入力した場合は「3 and 0 are not both positive.」と出力されていることがわかります.
1 2 3 4 5 6 7 |
$ gcc and_operator.c $ a.out Please input two integers: 3 4 3 and 4 are both positve. $ a.out Please input two integers: 3 0 3 and 0 are not both positve. |
論理積を含む演算子を学びたいあなたは,演算子とはを読みましょう.
a & b:ビット毎の論理積演算子(&)
ビット毎の論理積演算子(&)はビット毎に論理積を計算し,両方のビットが1ならば1,そうでなければ0になります.
LinuxカーネルのようなOSでは,フラグのマスク処理に利用します.
以下の2行は同じビット毎の論理積演算子の処理を表すことに注意して下さい.
特に,2行目の書き方は頻出ですので,覚えましょう!
1 2 |
a = a & b; a &= b; |
ビット毎の論理積演算子を利用するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { unsigned int a = 0xaaaa, b = 0x00ff; printf("0x%04x & 0x%04x = 0x%04x\n", a, b, a & b); a &= b; printf("0x%04x\n", a); return 0; } |
実行結果は以下になります.
0xaaaaと0xffffのビット毎の論理積演算子による結果が0x00aaとなっています(3行目).
また,「a & b」と「a &= b」の結果も同じです(3~4行目).
1 2 3 4 |
$ gcc bit_and_operator.c $ a.out 0xaaaa & 0x00ff = 0x00aa 0x00aa |
ビット毎の論理積演算子を含むビット演算子を学びたいあなたは,ビット演算子とシフト演算子の使い方読みましょう.
まとめ
C言語で&を利用する3つの演算子を紹介しました.
- &a,*b:アドレス演算子(&)と間接演算子(*)
- a && b:論理積演算子(&&)
- a & b:ビット毎の論理積演算子(&)
どの演算子も頻出ですので,正しく理解しましょう.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!