CS50 Lecture2
CS50 Lecture2
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
}
01111111 01000101 01001100 01000110 00000010 00000001 00000001 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000010 00000000 00111110 00000000 00000001 00000000 00000000 00000000
10110000 00000101 01000000 00000000 00000000 00000000 00000000 00000000
01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
11010000 00010011 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 01000000 00000000 00111000 00000000
00001001 00000000 01000000 00000000 00100100 00000000 00100001 00000000
00000110 00000000 00000000 00000000 00000101 00000000 00000000 00000000
01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
01000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000
01000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000
11111000 00000001 00000000 00000000 00000000 00000000 00000000 00000000
11111000 00000001 00000000 00000000 00000000 00000000 00000000 00000000
00001000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000011 00000000 00000000 00000000 00000100 00000000 00000000 00000000
00111000 00000010 00000000 00000000 00000000 00000000 00000000 00000000
...
make hello
./hello
clang hello.c
./a.out
clang -o hello hello.c
./hello
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
clang -o hello hello.c -lcs50
./hello
make hello
./hello
compiling
preprocessing
compiling
assembling
linking
preprocessing
compiling
assembling
linking
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
string get_string(string prompt);
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
string get_string(string prompt);
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
string get_string(string prompt);
int printf(string format, ...);
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
...
string get_string(string prompt);
int printf(string format, ...);
...
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
preprocessing
compiling
assembling
linking
...
string get_string(string prompt);
int printf(string format, ...);
...
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
...
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
xorl %eax, %eax
movl %eax, %edi
movabsq $.L.str, %rsi
movb $0, %al
callq get_string
movabsq $.L.str.1, %rdi
movq %rax, -8(%rbp)
movq -8(%rbp), %rsi
movb $0, %al
callq printf
...
...
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
xorl %eax, %eax
movl %eax, %edi
movabsq $.L.str, %rsi
movb $0, %al
callq get_string
movabsq $.L.str.1, %rdi
movq %rax, -8(%rbp)
movq -8(%rbp), %rsi
movb $0, %al
callq printf
...
...
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
xorl %eax, %eax
movl %eax, %edi
movabsq $.L.str, %rsi
movb $0, %al
callq get_string
movabsq $.L.str.1, %rdi
movq %rax, -8(%rbp)
movq -8(%rbp), %rsi
movb $0, %al
callq printf
...
preprocessing
compiling
assembling
linking
...
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
xorl %eax, %eax
movl %eax, %edi
movabsq $.L.str, %rsi
movb $0, %al
callq get_string
movabsq $.L.str.1, %rdi
movq %rax, -8(%rbp)
movq -8(%rbp), %rsi
movb $0, %al
callq printf
...
01111111010001010100110001000110
00000010000000010000000100000000
00000000000000000000000000000000
00000000000000000000000000000000
00000001000000000011111000000000
00000001000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
10100000000000100000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
01000000000000000000000000000000
00000000000000000100000000000000
00001010000000000000000100000000
01010101010010001000100111100101
01001000100000111110110000010000
00110001110000001000100111000111
01001000101111100000000000000000
00000000000000000000000000000000
00000000000000001011000000000000
11101000000000000000000000000000
00000000010010001011111100000000
00000000000000000000000000000000
00000000000000000000000001001000
...
preprocessing
compiling
assembling
linking
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name? ");
printf("hello, %s\n", name);
}
hello.c
hello.c cs50.c
hello.c cs50.c stdio.c
01111111010001010100110001000110
00000010000000010000000100000000
00000000000000000000000000000000
00000000000000000000000000000000
00000001000000000011111000000000
00000001000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
10100000000000100000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
01000000000000000000000000000000 cs50.c stdio.c
00000000000000000100000000000000
00001010000000000000000100000000
01010101010010001000100111100101
01001000100000111110110000010000
00110001110000001000100111000111
01001000101111100000000000000000
00000000000000000000000000000000
00000000000000001011000000000000
11101000000000000000000000000000
00000000010010001011111100000000
00000000000000000000000000000000
00000000000000000000000001001000
...
01111111010001010100110001000110 01111111010001010100110001000110
00000010000000010000000100000000 00000010000000010000000100000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000001000000000011111000000000 00000011000000000011111000000000
00000001000000000000000000000000 00000001000000000000000000000000
00000000000000000000000000000000 11000000000011110000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 01000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
10100000000000100000000000000000 00101000001100100000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
01000000000000000000000000000000 01000000000000000011100000000000 stdio.c
00000000000000000100000000000000 00000111000000000100000000000000
00001010000000000000000100000000 00011100000000000001100100000000
01010101010010001000100111100101 00000001000000000000000000000000
01001000100000111110110000010000 00000101000000000000000000000000
00110001110000001000100111000111 00000000000000000000000000000000
01001000101111100000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000001011000000000000 00000000000000000000000000000000
11101000000000000000000000000000 00000000000000000000000000000000
00000000010010001011111100000000 00000000000000000000000000000000
00000000000000000000000000000000 01011100001001010000000000000000
00000000000000000000000001001000 00000000000000000000000000000000
... ...
01111111010001010100110001000110 01111111010001010100110001000110 00101111011011000110100101100010
00000010000000010000000100000000 00000010000000010000000100000000 01100011001011100111001101101111
00000000000000000000000000000000 00000000000000000000000000000000 00101110001101100010000000101111
00000000000000000000000000000000 00000000000000000000000000000000 01110101011100110111001000101111
00000001000000000011111000000000 00000011000000000011111000000000 01101100011010010110001000101111
00000001000000000000000000000000 00000001000000000000000000000000 01111000001110000011011001011111
00000000000000000000000000000000 11000000000011110000000000000000 00110110001101000010110101101100
00000000000000000000000000000000 00000000000000000000000000000000 01101001011011100111010101111000
00000000000000000000000000000000 01000000000000000000000000000000 00101101011001110110111001110101
00000000000000000000000000000000 00000000000000000000000000000000 00101111011011000110100101100010
10100000000000100000000000000000 00101000001100100000000000000000 01100011010111110110111001101111
00000000000000000000000000000000 00000000000000000000000000000000 01101110011100110110100001100001
00000000000000000000000000000000 00000000000000000000000000000000 01110010011001010110010000101110
01000000000000000000000000000000 01000000000000000011100000000000 01100001001000000010000001000001
00000000000000000100000000000000 00000111000000000100000000000000 01010011010111110100111001000101
00001010000000000000000100000000 00011100000000000001100100000000 01000101010001000100010101000100
01010101010010001000100111100101 00000001000000000000000000000000 00100000001010000010000000101111
01001000100000111110110000010000 00000101000000000000000000000000 01101100011010010110001000101111
00110001110000001000100111000111 00000000000000000000000000000000 01111000001110000011011001011111
01001000101111100000000000000000 00000000000000000000000000000000 00110110001101000010110101101100
00000000000000000000000000000000 00000000000000000000000000000000 01101001011011100111010101111000
00000000000000001011000000000000 00000000000000000000000000000000 00101101011001110110111001110101
11101000000000000000000000000000 00000000000000000000000000000000 00101111011011000110010000101101
00000000010010001011111100000000 00000000000000000000000000000000 01101100011010010110111001110101
00000000000000000000000000000000 01011100001001010000000000000000 01111000001011010111100000111000
00000000000000000000000001001000 00000000000000000000000000000000 00110110001011010011011000110100
... ... ...
011111110100010101001100010001100000001000000001000000010000000000000000000000000000000000000000000000
000000000000000000000000000000000100000000001111100000000000000001000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000001010000000000010000000000000000000000000000000000000000000000000000000000000000000000000
000000000100000000000000000000000000000000000000000000000100000000000000000010100000000000000001000000
000101010101001000100010011110010101001000100000111110110000010000001100011100000010001001110001110100
100010111110000000000000000000000000000000000000000000000000000000000000000010110000000000001110100000
000000000000000000000000000000010010001011111100000000000000000000000000000000000000000000000000000000
0000000001001000...01111111010001010100110001000110000000100000000100000001000000000000000000000000000
000000000000000000000000000000000000000000000000000110000000000111110000000000000000100000000000000000
000000011000000000011110000000000000000000000000000000000000000000000000100000000000000000000000000000
000000000000000000000000000000000001010000011001000000000000000000000000000000000000000000000000000000
000000000000000000000000000010000000000000000111000000000000000011100000000010000000000000000011100000
000000001100100000000000000010000000000000000000000000000010100000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000001011100001001010000000000000
00000000000000000000000000000000000...0010111101101100011010010110001001100011001011100111001101101111
001011100011011000100000001011110111010101110011011100100010111101101100011010010110001000101111011110
000011100000110110010111110011011000110100001011010110110001101001011011100111010101111000001011010110
011101101110011101010010111101101100011010010110001001100011010111110110111001101111011011100111001101
101000011000010111001001100101011001000010111001100001001000000010000001000001010100110101111101001110
010001010100010101000100010001010100010000100000001010000010000000101111011011000110100101100010001011
110111100000111000001101100101111100110110001101000010110101101100011010010110111001110101011110000010
110101100111011011100111010100101111011011000110010000101101011011000110100101101110011101010111100000
101101011110000011100000110110001011010011011000110100...
preprocessing
compiling
assembling
linking
compiling
debugging
printf
printf
debugger
printf
debugger
rubber duck
types
bool
char
double
float
int
long
string
...
bool 1 byte
char 1 byte
double 8 bytes
float 4 bytes
int 4 bytes
long 8 bytes
string ? bytes
...
int score1 = 72;
33
score3
00000000000000000000000001001000 00000000000000000000000001001001
score1 score2
00000000000000000000000000100001
score3
int score1 = 72;
scores[0] = 72;
scores[1] = 73;
scores[2] = 33;
72 73
scores[0] scores[1]
33
scores[2]
char c1 = 'H';
char c2 = 'I';
char c3 = '!';
H I !
c1 c2 c3
72 73 33
c1 c2 c3
01001000 01001001 00100001
c1 c2 c3
string s = "HI!";
H I !
s
H I !
s[0] s[1] s[2]
H I ! \0
s[0] s[1] s[2] s[3]
72 73 33 0
s[0] s[1] s[2] s[3]
H I ! \0
s
NUL
string s = "HI!";
string t = "BYE!";
H I ! \0
s
H I ! \0 B Y E !
s t
\0
H I ! \0 B Y E !
s[0] s[1] s[2] s[3] t[0] t[1] t[2] t[3]
\0
t[4]
string words[2];
words[0] = "HI!";
words[1] = "BYE!";
string
manual pages
command-line arguments
#include <stdio.h>
int main(void)
{
...
}
#include <stdio.h>
int main(void)
{
...
}
#include <stdio.h>
int main(void)
{
...
}
#include <stdio.h>
int main(void)
{
...
}
readability
One fish. Two fish. Red fish. Blue fish.
Before Grade 1
Mr. and Mrs. Dursley, of number four, Privet Drive, were
proud to say that they were perfectly normal, thank you
very much. They were the last people you'd expect to be
involved in anything strange or mysterious, because they
just didn't hold with such nonsense...
Grade 7
cryptography
input → → output
plaintext → → ciphertext
plaintext → cipher → ciphertext
key →
plaintext → cipher → ciphertext
1 →
HI! →
1 →
HI! → → IJ!
-1 →
UIJT XBT DT50 →
U I J T X B T D T 5 0
T I J T X B T D T 5 0
T H J T X B T D T 5 0
T H I T X B T D T 5 0
T H I S X B T D T 5 0
T H I S W B T D T 5 0
T H I S W A T D T 5 0
T H I S W A S D T 5 0
T H I S W A S C T 5 0
T H I S W A S C S 5 0