Annoying error

First, I know that I don't speak English perfectly because English is not my navite language. I hope you'll understand me.

I have no programming knowledge, I'm trying to do my best with using example codes which I found from blogs. Please focus on the error, not accuracy of commands.
I want LCD to print "Hello World!" cliché when I press the button. This is the code that I use:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() 
{
  pinMode(7, INPUT);  
}

void loop() ; 
{
  
  lcd.begin(16, 2);
  if ((digitalRead(7, HIGH)); 
  lcd.print("hello, world!" ; )) 
}

Error: "expected unqualified-id before '{' token"

It's weird to use semicolon after void loop() (because I didn't use semicolon after void loop() command in my previous projects) but when I don't do this, I get these errors:

"lcd_potansiyometre.ino: In function 'void loop()':

lcd_potansiyometre.ino:18:27: error: too many arguments to function 'int digitalRead(uint8_t)'

In file included from lcd_potansiyometre.ino:4:0:

C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:127:5: note: declared here

int digitalRead(uint8_t);

error: expected ')' before ';' token

error: expected ')' before ';' token

error: expected primary-expression before ')' token

error: expected ';' before ')' token"

Why semicolon after void loop() is required that much?
How can I solve "expected unqualified-id before '{' token" problem?

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() 
{
  pinMode(7, INPUT);  
}

void loop()
{ //this matches the one at the end of the loop, stuff between these is what gets run when loop() is called. 
  lcd.begin(16, 2);
  if (digitalRead(7)==HIGH)  //no semicolon here
{ //brace to start block of code run if the if statement is true
  lcd.print("hello, world!");  //semicolon at the end of the line
} //brace to close that code block. 
} //end of loop

Semicolons go at the end of everything other than a function declaration, or an if/then.
You had a semicolon after the 'void loop()' bit that starts the function declaration, between that and the { that starts the code in the loop function.

You also had the syntax for loop wrong, it's

if (condition) {
doStuff();
doMoreStuff(); //etc
}

You can leave out the {}'s if there's only 1 statement, but it's best practice to always use them, since it's hard to tell at a glance whether it's going to do what you think without them, and with them, you can tell the IDE to indent it so it's clear what's in which code block (ctrl+T I think it is?)

Also, you did if(digitalRead(pin,HIGH)). But digitalRead only takes one argument, the pin number, and returns the value of that pin. You want to compare that value with HIGH to see if they match. What you want is if(digitalRead(pin)==HIGH).

As it happens, you can also do if(digitalRead(pin)), and it will do the same thing. HIGH is a constant equal to 1, while LOW is a constant equal to 0. So digitalRead() is just returning 0 or 1. 0 evaluates to false, while 1 (or any other number) evaluates as true.

The reason why a semicolon after void loop() seems to help is that there are other errors in the program. Try this version:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int ButtonPin = 7; //delcare pin numbers and other useful constants with names 
void setup()
{
  pinMode(ButtonPin, INPUT);
  lcd.begin(16, 2);  //move the begin action to setup so that it only happens once
}

void loop() //remove the incorrect semicolon
{
  //we want to wait until the pin becomes high, so use an empty while loop
  while (digitalRead(ButtonPin) == LOW) //also fix the incorrect use of digitalRead, remember "==" means "compare"
  {
    //empty
  }
  lcd.print("hello, world!" ; ))

  //now we're finished, just wait forever
  while (true)
  {
    //empty
  }
}

Try this:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int ButtonPin = 7; //delcare pin numbers and other useful constants with names 
void setup()
{
  pinMode(ButtonPin, INPUT);
  lcd.begin(16, 2);  //move the begin action to setup so that it only happens once
}

void loop() //remove the incorrect semicolon
{
  //we want to wait until the pin becomes high, so use an empty while loop
  while (digitalRead(ButtonPin) == LOW); //also fix the incorrect use of digitalRead, remember "==" means "compare"
  //You don't need braces for an empty function/loop
  lcd.print("hello, world!"); //A semicolon goes after the parameters, also make sure the parameter count matches

  //now we're finished, just wait forever
  while (true); //Again, no need for braces
}

The reason you get fewer errors when you put the semicolon after the loop is that the compiler gives up earlier and doesn't find all of the other errors.

You might have dealt with this better by actually reading the error messages and addressing the errors. The arduino GUI badly, badly needs to highlight the code after the compiler is run with the errors.

This error here:

lcd_potansiyometre.ino:18:27: error: too many arguments to function 'int digitalRead(uint8_t)'

It's not impenetrable gobbledygook. On line 18, you have put too many finction arguments to digitalRead. If you inspect the docs, you will find that digitalRead takes one argument (the pin number) and returns a boolean true or false.

PS: ignore lights0123's advice on this:

  while (digitalRead(ButtonPin) == LOW);

Although this works, it's very common for people who don't understand what they are doing to put semicolons everywhere. Consequently, this looks like a coding error. Doing it this way:

  while (digitalRead(ButtonPin) == LOW)
    ; // do nothing

tells a reader "yes, I meant to do that."

Doing it this way:

  while (digitalRead(ButtonPin) == LOW)

; // do nothing



tells a reader "yes, I meant to do that."

Even better is to use curly braces:

  while (digitalRead(ButtonPin) == LOW)
  {
     // do nothing
  }

No confusing semicolon needed that way.